c++ - 什么样的容器适合 "The Powder Toy"风格的沙箱?

标签 c++ stl particle-system

基本上我正在制作一款类似于 The Powder Toy 的游戏。在一个给定的帧中,世界最多可以有 256,000 个粒子。在我旧的 Javascript 实现中,我遍历了每个像素,这导致了严重的延迟,因为即使只有大约 20,000 个粒子处于事件状态,256,000 个像素也需要经过很多。我决定改用一个装满所有当前事件粒子的容器,但随后遇到了一个问题,即在特定坐标处查询容器中的粒子也是处理器密集型的。因此我想出了一个简单的解决方案,我应该将所有粒子保存在一个查找表(二维数组)中,还有一个堆( active 粒子数组),并在使用查找表作为引用的同时迭代堆。对堆所做的任何事情都会对查找表完成,反之亦然。这在 Javascript 中运行良好,但现在因为我需要将我的程序移植到 C++,所以我很难找到一个好的容器来容纳堆。 vector 的添加和删除速度非常慢,我无法通过引用从 vector 中轻松删除对象。

我应该使用哪个容器,如果有更好的方法来处理粉末玩具中的颗粒,那是什么?提前致谢,对于那些不熟悉 The Powder Toy 的人,这是一张图片。

enter image description here

注意每个像素都有一个粒子,类似的构建在我的电脑上运行得非常快。我想知道他们是怎么做到的...

最佳答案

vector 可以很好地解决这类问题。它们提供连续存储,因此可以更好地使用缓存。

尝试通过构造函数或使用 std::vector::reserve() 预先分配适当的 vector 容量。否则,每当您的 vector 大小超过当前容量时,都会触发已分配存储空间的自动重新分配。

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

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

代替:

std::vector::erase()

std::vector::pop_back()std::swap() 的复杂度都是常量,std::vector::erase() 是线性的。

但是如果您需要保留元素的顺序,swap - pop 方法就没有用了。

关于c++ - 什么样的容器适合 "The Powder Toy"风格的沙箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49352676/

相关文章:

c++ - 通过 OpenGL Assimp 加载的对象有时会反转法线

c++ - 由于复制构造函数,vector .pushback 方法未将类对象插入 vector

c++ - 在函数外访问堆栈对象

ios - 发射开始后更改 CAEmitterLayer 的 CAEmitterCell 属性

c++ - 为什么下面的 C++ 程序打印字符串的 ascii 值而不是字符?

c++ - 是否可以在 RAD Studio 10 c++ 中设置 Window (x, y) Position?

python - 导出 32 位枚举时 Boost Python 1.48 失败

c++ - 如何将 std::set_intersection 用于 2 个不同但相关的类型并输出到另一种类型

ios - 如何将 SKEmitterNode 添加到 SKScene(它没有显示)?

c# - 统一: Change Particle System to pooling