search地图的次数更less

…或者更好,不需要search地图。

我正在寻找如何优化我的代码或devise更改的建议。

在我的基于组件的实体系统中,实体由属性和行为对象组成。 行为对象只存储在一个std :: vector中; 他们没有问题,我只是打电话给他们的更新function。

属性,我存储在<std::string, Attribute>的地图中,它们表示行为(行为从不直接交互)之间的通信path。 行为需要一个属性时,它会search其实体的地图。

对于行为来说,每秒钟访问这些信息有点困难,比如渲染行为(在屏幕上绘制实体)。 渲染需要读取“位置”,“方向”和其他一些东西,而且每秒需要执行几次。

我该如何解决这个问题? 还应该注意的是,基类“实体”,“属性”和“行为”是用C ++编写的,但是它们是用Python编写的。

在我说别的之前 – 这是造成问题吗? 因为如果它不造成问题,不要过早地优化它。 对不起,如果你已经知道了,但是不得不说。 如果你不知道老克努特说什么,我会在这里注意到你。

否则…太多的间接性在实时仿真中往往会成为一个问题。 如果你devise的东西,这是你可能打的墙。 你已经知道问题是什么, 我想是时候做出决定,在哪里真的有必要有这种间接的水平。 有了实体系统,最好把事情保持简单,就游戏逻辑而言,这就是“金属”。 最好保持所有的金属真的很接近。

我建议的唯一的其他解决scheme是使用更有效的数据结构…如果这是可能的在你的情况。

为什么,如果我可能会问,对于你的行为(我认为我和我其他人会称为实体组件)是否直接相互对话呢?

我可以建议一篇文章: 编码牛仔 – 进化你的Hieararchy 。 它应该给你一点洞察,这是多么简单,并已在许多游戏。 在这篇文章中,笔者特指Tony Hawk早期的游戏的发展。

编辑:(在回应你的第一和第二评论)不,他们不必查询实体。 那就是问题所在! 每个EntityComponent 都必须有固定的引用,与其相关的EntityComponent或与之相关的EntityComponents(取决于你如何看待事物)。 你的问题是你正在做每个更新的查找。 我所说的是你只是这样做的一次 :你给每个组件一个固定的引用它依赖的任何组件,从注入这些依赖的时间,这意味着,例如,一个寻路组件将要需要引用空间分量; 没有它,它不知道它在空间中的位置,因此不能寻找path。 所以你要么以正确的顺序将所有这些组件注入到实体创建中(通常你的实体工厂会这样做),或者在基础实体类中构建一个智能系统,重新检查每个新组件的所有依赖关系,并设置修正它们之间的参考。 但是固定引用是必需的,否则你将面临现在正面临的问题 – 无论你如何看待它,查找都会有成本,而且它们不属于你的架构中的任何实时游戏。

交换一个hash_map或一个unordered_map(无论你的编译器支持)的地图。