XNA 粒子系统的性能表现

3
我有一个使用基本精灵批处理的粒子系统,其中粒子是根据递减的alpha值创建和销毁直到为0。
该系统在PC上性能相当差,在Xbox上非常差,在屏幕上显示大约一百个粒子之前会显著降低帧率。我已经阅读了关于如何提高性能的相关内容,但是否有任何实现它们的提示?例如,重用粒子而不是kill()最好的方法是什么?每个粒子的图像大小是否有影响?如果我不旋转每个粒子,这会有所帮助吗?
我已经尝试了每个建议,但没有得到任何显着的改善-是否有人有建议-是否值得基于GPU而不是CPU?

1
发布一些代码。特别是你的SpriteBatch调用,特别是Begin - Andrew Russell
在我的particleengine.cs文件中,我在Draw方法中有以下代码: particles[index].Draw(spriteBatch);在particle.cs文件中,我在Draw方法中调用了所有变量: spriteBatch.Draw(texture, color, rotation size.....最后,在我的Game1.cs文件中: ParticleEngine.Draw(spriteBatch);我能否让这个过程更加高效? - Paul
1
你应该编辑你的问题,并放置你的粒子Draw和粒子引擎Draw方法的代码。每个粒子的方法调用可能会带来太多的开销。我希望也能看到你的Begin调用。 - Andrew Russell
不太明白你的问题 - 代码基本上就是我上面所写的,每个都有一个spriteBatch.Begin();和spriteBatch.End;。 - Paul
2个回答

4
据我所知,销毁和创建粒子会大大降低性能。您可能需要重复使用粒子。
如果图像不是特别大,大小或旋转可能不会显著降低性能。
我将拥有一个数组,并将死亡的粒子交换到活动粒子的末尾,因此仅处理活动粒子。
例如:
创建一个最大粒子的数组; 当您需要一个粒子时,请获取particle_array [count]; 增加计数。 当粒子死亡时,减少计数,将该粒子与particle_array [count]交换; 仅更新计数个粒子;
希望这可以帮助到您。

1

我完全同意subsonic的回答,但我想进一步扩展一下。

每次创建新粒子并销毁(或放弃)旧粒子会产生大量垃圾。在C#中避免垃圾尤其重要,特别是在Xbox上(由于紧凑框架的垃圾处理能力较差),永远不要在update/draw循环中new一个类类型。总是预先创建到池中。Shawn H解释了这一点:http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx

另一个需要考虑的问题是,使用多个纹理可能会导致sprite batch变慢,因为需要进行多次绘制调用。尝试将多个粒子纹理合并成一个,并使用源矩形SpriteBatch.Draw参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接