又到了提出XNA问题的时候了。这次,从技术设计的角度出发。
我的情况是这样的:我创建了一个基于GPU计算的粒子引擎,尽管远未完成,但它可以运行。我的GPU轻松处理了10000个粒子而毫不费力,如果我添加更多粒子,我也不会感到惊讶。
我的问题是:每当有大量粒子同时创建时,我的帧率就会非常低。为什么?因为有很多CPU使用率,即使我已经将其最小化,几乎只包含内存操作。
粒子的创建仍然是由CPU调用完成的,例如:
- 方法想要创建粒子并进行调用。
- 四边形以顶点的形式创建,并存储在缓冲区中
- 缓冲区插入GPU,我的CPU可以专注于其他事情
当我有大约4个发射器每帧创建一个粒子时,我的FPS降低了(当然,每秒仅4帧,但15个发射器会将我的FPS降至25)。
创建粒子:
//### As you can see, not a lot of action here. ###
ParticleVertex []tmpVertices = ParticleQuad.Vertices(Position,Velocity,this.TimeAlive);
particleVertices[i] = tmpVertices[0];
particleVertices[i + 1] = tmpVertices[1];
particleVertices[i + 2] = tmpVertices[2];
particleVertices[i + 3] = tmpVertices[3];
particleVertices[i + 4] = tmpVertices[4];
particleVertices[i + 5] = tmpVertices[5];
particleVertexBuffer.SetData(particleVertices);
我认为,也许我不应该频繁地创建粒子,或许有一种方法可以让GPU创建所有东西,或者可能是因为我不知道你是如何完成这些工作的。 ;)
编辑:如果我不经常创建粒子,仍然可以使效果看起来好吗?
所以我在这里发帖,希望您知道一个好的粒子引擎应该如何设计,如果我某处走错了路,也请告诉我。