我已经实现了一个实体组件系统来管理游戏引擎中的实体,使用std :: map管理组件。现在主要部分是将所有实体保存在CWorld类中。这些实体可以通过CWorld直接访问索引,添加组件等。并且,每个tick都会迭代所有实体以进行更新和渲染操作。并且列表不会是静态的,你可以猜测,我的意思是实体可能会死,所以需要在某些时候从列表中删除。在这一点上,我需要询问std :: vector和set之间的区别,或者任何持有实体的建议。
答案 0 :(得分:2)
如果要按索引访问元素,并且旧元素可能会死亡以使活动索引的范围可能包含间隙,那么映射可能是最简单的解决方案。 Map还允许您轻松地迭代和删除单个实体。
列表很容易删除单个实体,但很难通过索引查找特定实体。
很难在不留空隙的情况下删除单个实体。通过插入间隙,删除后的实体索引将发生变化。
答案 1 :(得分:2)
虽然你最好在game development堆栈交换上询问这个问题,但我会补充一点:STL只做出有关扩展的承诺,它不会对实际成本作出承诺。 O(1)是表达式的右手:“x = O(1)”其中“O”是“操作”的成本。 “fopen”是一项操作,费用为O(1)。 O(1)便宜吗?
您需要对代码运行perf分析并查看每个类的规范 - 您甚至可能需要自己编写,因为STL容器是泛型而未优化对于任何特定用例。
要关注的是操作频率 - 读,写,管理。假设每隔10毫秒就有一个勾号,那么你似乎不太可能在走到列表时经常移除实体。你在实现自己的场景图吗?如果是这样,粒度将决定实体在空间之间移动的频率,这应该是您采用的模式中的一个因素:如果管理开销的频率足够低,您可以负担得起具有高成本的管理结构,但仍然希望避免O(N)的东西,除非O()非常非常便宜。