我有一个使用基本spritebatch的粒子系统,其中粒子是根据递减的alpha值创建和销毁的,直到0。
系统的性能在PC上相当差,在xbox上非常差,在显着的fps减慢之前屏幕上有大约一百个粒子,我已经读过有关如何提高性能但是有没有人有任何提示如何实现它们,例如什么是最好的方法 - 重用粒子而不是kill()?每个粒子的图像大小是否有所不同?如果我不旋转每个粒子会有帮助吗?
我已经玩过这些建议,但没有得到任何重大改进 - 有没有人有任何建议 - 是否值得去gpu而不是基于cpu?
答案 0 :(得分:4)
据我所知,破坏和创造粒子会大大降低性能。 您可能希望重用粒子。
只要图像不是很大,就不确定图像尺寸或旋转会大幅降低性能。
我会有一个数组,它将死粒子交换到活性粒子的末端,因此只处理活性粒子。
例如:
Make an array of MAX particles; When you need a particle grab particle_array[count]; Increment count. When a particle dies, decrement count, swap the particle with particle_array[count]; Update only count particles;
希望这有帮助。
答案 1 :(得分:1)
我完全同意亚音速的答案,但我想扩展它。
每次创建一个新粒子并破坏(或放弃)旧粒子会产生大量垃圾。 C#中的垃圾回避口头禅,特别是在Xbox上(由于紧凑的框架的垃圾处理不当),在更新/绘制循环中永远不会new
类类型。始终预先创建池。 Shawn H解释说:http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx。
另外需要考虑的是,由于多次绘制调用,使用多个纹理会导致sprite批处理速度变慢。尝试将多个粒子纹理合并为一个,并使用源矩形SpriteBatch.Draw
参数。