一次管理多个对象

时间:2010-03-21 17:34:31

标签: c++ object

我想找到一种有效跟踪大量对象的方法。我能想到的一个实际例子是粒子系统。如何跟踪数百个粒子?我认为我走在正确的轨道上,我找到了“实例化”这个词,我也学到了关于flyweights的知识。希望有人可以对此有所了解,并与我分享一些技巧。 感谢。

4 个答案:

答案 0 :(得分:2)

如何跟踪对象取决于你想要用它们做什么。您是否需要快速访问索引已知的某些粒子?然后使用vector。你的粒子是否以名字映射?然后你可以使用map。等等,等等。

除非您选择特别糟糕的数据结构,否则“数以百计”的对象肯定不是C ++应该担心的问题。你为什么关心?你认为你会浪费太多记忆吗?或者运行时间慢?在任何情况下,您都必须准确描述所涉及的对象及其所需的操作,然后选择适当的数据结构。

答案 1 :(得分:0)

如果不循环使用它们,就无法处理它们。

容器类可能存在局部性问题(缓存性能)。您可以考虑使用自定义分配器,但当然还有其他方法。

循环最快的数据结构是一个数组或向量,数据实际上在向量中 - 未指向。显然这会在flyweight适当的情况下崩溃,其中容器中有很多指针,但只有少量指向对象 - 但是必须有独特的特性以及指向共享特征的指针(不将一千颗粒子全部放在同一位置并向同一方向移动。)

要更新共享特征,您只需遍历该容器即可。

一个问题是从指针向量和唯一细节的中间有效删除。将顶部项目交换或复制到该空间,然后删除顶部项目。

使用共享数据,不要这样做 - 首先它意味着更新引用,其次是有足够的共享数据,复制是一个过度的开销,第三个缓存是一个问题,无论你做什么,因为大多数访问是随机的顺序(按顺序迭代指针,而不是它们指向的对象)。只需保留一个免费列表,这样您就可以轻松找到差距,将新项目放入其中。您可能正在使用该链接列出有效项目,因此您可以轻松地迭代它们。您甚至可能有一两个额外的链接,因此您可以拥有仅限于特定项目的列表 - 没有理由说每个项目不应出现在多个列表中。

编辑 - 我基本上是在谈论侵入式链接列表。链接列表代码非常简单,但您可以使用Boost intrusive container库。

最后,根据您的性能限制,您可能会发现所有这些只需要成千上万个对象。

编辑 - 关于瓷砖。

瓦片的明显方法是一个大的二维数组。可以很容易地逐行迭代这样一个数组的剪切区域。但是,使用基于图块的渲染时,您很可能想要一次绘制特定类型的所有图块,然后是所有下一个类型,依此类推,其中类型确定渲染它们所需的纹理。

我会说为每种瓷砖类型使用一个绘图列表。在每次更新时从头开始重建您的绘图列表 - 这只是瓷砖地图的一次扫描。然后,一次处理/渲染一种类型的瓷砖很容易。您可以对绘图列表进行增量更新,但这可能是不必要的。同样,您可能会将绘制列表保留在数组而不是链接列表中。

答案 2 :(得分:0)

您可以跟踪许多任何事物,跟踪许多物体。

如果您想通过名称或命名属性“跟踪”它们,请使用哈希表。

如果要按某些属性的顺序“跟踪”它们,请使用已排序的数组或树(二进制或多向)。

如果您想简单地遍历它们,那么使用数组或链表。

如果你需要上面的几个,那么你可以使用多种方法。

答案 3 :(得分:0)

在网站GameProgrammingPatterns上,take a look at the Object Pool pattern。它的写得非常好。

来自文章:
通过重用固定池中的对象而不是单独分配和释放它们来提高性能和内存使用。