我有一个存储粒子指针的粒子池
它有大量的粒子
每个粒子都有 IsActive 变量
根据活动状态对每帧向量进行分区时,CPU使用率很高
那么,在工作线程上每隔几秒就对向量进行分区是一种好方法吗?
由于活动的顺序无关紧要,并且它们不会经常变为活动或不活动,因此您可以使用技巧将活动粒子保持在最前面:
假设这nActive
是活动粒子的数量。
当一个不活跃的粒子变得活跃时,是否std::swap(vector[nParticle], vector[nActive]); nActive++;
让它成为最后一个活跃的粒子- 无论什么不活跃的粒子已经在那个槽中,都会去粒子曾经所在的地方,我们不在乎,因为我们不在乎命令。
当一个活跃的粒子变得不活跃时,是否nActive--; std::swap(vector[nParticle], vector[nActive]);
让它成为第一个不活跃的粒子——不管那个槽里已经有什么活跃的粒子,都会去粒子曾经所在的地方,我们不在乎,因为我们不在乎命令。
您可以通过记住使粒子处于活动或不活动状态很容易来记住这个技巧 - 如果我们不关心它是哪个 - 因为我们只是从 中加或减 1 nActive
。但是我们不知道我们刚刚改变了哪个粒子。因此,我们将那个粒子与我们打算改变的那个交换,我们不在乎那个粒子去哪里,只要它保持不活动或保持活动(不改变)。
像这样:
+-----------+-----------+-----------+-----------+
| Particle0 | Particle1 | Particle2 | Particle3 |
| active | active | inactive | inactive |
+-----------+-----------+-----------+-----------+
^
|
nActive==2
激活粒子 3:交换粒子 3 和 2,然后增加 nActive:
+-----------+-----------+-----------+-----------+
| Particle0 | Particle1 | Particle3 | Particle2 |
| active | active | active | inactive |
+-----------+-----------+-----------+-----------+
^
|
nActive==3
使粒子 0 不活动:减少 nActive,然后交换粒子 3(在插槽 2 中)和 0。
+-----------+-----------+-----------+-----------+
| Particle3 | Particle1 | Particle0 | Particle2 |
| active | active | inactive | inactive |
+-----------+-----------+-----------+-----------+
^
|
nActive==2
现在粒子顺序都乱七八糟了,但你不在乎,对吧?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句