什么样的容器适合“粉末玩具”式沙箱?

时间:2018-03-18 20:49:06

标签: c++ stl particle-system

基本上我正在制作类似粉末玩具的游戏。在一个给定的帧中,世界最多可以有256,000个粒子。在我原来的Javascript实现中,我遍历每个像素并且它导致了严重的延迟,因为即使只有大约20,000个粒子处于活动状态,256,000也要经历很多。我决定让一个容器装满所有当前活动的粒子,但后来又遇到了一个问题,即查询容器中特定坐标处的粒子也是处理器密集型的。因此,我提出了一个简单的解决方案,我应该将所有粒子保存在查找表(二维数组)中,并且还有一个堆(活动粒子数组),并在使用查找表作为参考时迭代堆。对堆执行的任何操作都将在查找表中完成,反之亦然。这在Javascript中工作得非常好但是现在因为我需要将程序移植到C ++,所以我找不到容纳堆的好容器。添加和删​​除的向量非常慢,我无法通过向量中的引用轻松删除对象。

我应该使用哪个容器,如果有更好的方法处理像粉末玩具那样的颗粒,它是什么?在此先感谢,这是一张不熟悉粉末玩具的人的照片。

enter image description here

注意每个像素是如何存在粒子的,并且类似的构建在我的计算机上运行得非常快。我不知道他们是怎么做到的......

1 个答案:

答案 0 :(得分:1)

矢量对于这类问题很好。它们提供连续的存储,因此可以更好地使用缓存。

尝试通过构造函数或使用(left, right) -> right预先分配适当的向量容量。如果没有这个,每次矢量的大小超过当前容量时,都会触发分配的存储空间的自动重新分配。

您还可以尝试使用std::vector::reserve()然后使用std::swap()从矢量中删除元素,如下所示:

std::vector::pop_back()

而不是:

std::swap(vect.back(), vect[1]);
vect.pop_back();

std::vector::erase() std::vector::pop_back()的复杂性是不变的,std::swap()的复杂性是线性的。

但是如果你需要保留元素的顺序,那么swap-pop方法是没用的。