1

我已经实现了一个实体组件系统来管理我在游戏引擎中的实体,使用 std::map 管理组件。现在主要部分是保存 CWorld 类中的所有实体。这些实体可以通过 CWorld 的索引直接访问,以添加组件等。此外,所有实体将在每个滴答中迭代以进行更新和渲染操作。而且该列表不会像您猜到的那样是静态的,我的意思是实体可能会死亡,因此需要在某个时候从列表中删除。在这一点上,我需要询问 std::vector 和 set 之间的区别,或者任何关于持有实体的建议。

4

2 回答 2

2

如果您想通过索引访问元素,并且如果旧元素可能会死掉以致活动索引的范围可能包含间隙,那么映射可能是最简单的解决方案。Map 还允许您轻松地迭代和删除单个实体。

列表很容易删除单个实体,但很难通过索引查找特定实体。

向量很难在不留空隙的情况下移除单个实体。通过填补空白,删除后的实体索引将发生变化。

于 2013-07-18T14:08:00.523 回答
2

虽然您最好在游戏开发堆栈交换上问这个问题的旋转,但我会补充一点:STL 只承诺扩展,它不承诺实际成本。O(1) 是表达式的右手:“x = O(1)”,其中“O”是“操作”的成本。“fopen”是一个操作,花费 O(1)。O(1) 便宜吗?

您需要对您的代码运行性能分析并查看每个类的规范——您甚至可能需要编写自己的,因为 STL 容器是通用的,并且没有针对任何特定的用例进行优化。

需要关注的是操作的频率——读、写、管理。假设每 10 毫秒一个滴答声,您似乎不太可能像在列表中那样频繁地删除实体。你在实现自己的场景图吗?如果是这样,粒度将决定实体在空间之间移动的频率,这应该是您采用的模式的一个因素:如果管理开销的频率足够低,您可以负担得起具有高成本的管理结构,但仍然希望避免 O(N) 的事情,除非 O() 非常非常便宜。

于 2013-07-18T16:50:12.863 回答