是时候讨论另一个 XNA 问题了。不过,这一次纯粹是从技术设计的角度来看。
我的情况是这样的:我创建了一个基于 GPU 计算的粒子引擎,虽然远未完成,但它确实有效。我的 GPU 可以轻松处理 10k 个粒子而不会出汗,如果我可以添加更多粒子,我不会感到惊讶。
我的问题:每当我同时创建很多粒子时,我的帧速率就会讨厌我。为什么?大量的 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 创造一切,或者我只是不知道你是怎么做这些东西的。;)
编辑:如果我不经常创建粒子,那么仍然让它看起来不错的解决方法是什么?
所以我在这里发帖希望你知道应该如何设计一个好的粒子引擎,如果我在某个地方走错了路。