2011-08-23 201 views
3

我使用基本spritebatch,其中正被创建和销毁的粒子基于递减α值直到0XNA粒子系统性能

该系统的性能比较是在PC相当差,和非常差的颗粒系统在xbox上,在显着fps减速之前,屏幕上有大约一百个粒子,我已经阅读了关于如何提高性能的文章,但是没有人有关于如何提示它们的提示,例如,最好的方式是 - 重复使用粒子比杀()?每个粒子的图像大小是否有所不同?如果我不旋转每个粒子,这会有帮助吗?

我玩过这些建议,但没有得到任何重大改进 - 有没有人有任何建议 - 是否值得使用GPU而不是基于CPU?

+1

发表了一些代码。特别是你的'SpriteBatch'调用,特别是'Begin'。 –

+0

所以在我的particleengine.cs中我有这个Draw: particles [index] .Draw(spriteBatch); 在particle.cs我呼吁所有在绘制变量: spriteBatch.Draw(质地,颜色,尺寸的旋转.....我Game1.cs 最后:) ParticleEngine.Draw(spriteBatch; – Paul

+1

你应该编辑你的问题,并将你的问题的代码放在你的粒子'Draw'和粒子引擎'Draw'方法中,每个粒子的方法调用可能是太多的开销,我希望看到你的' –

回答

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; 

希望这有助于。

+0

非常感谢 - 我想你' ve钉了 – Paul

1

我完全同意亚音速的答案,但我想扩大它。

每次创建一个新的粒子并摧毁(或放弃)旧粒子会产生大量垃圾。 C#中的垃圾回避咒语,尤其是在Xbox上(由于紧凑框架的垃圾处理不好),在更新/绘制循环中永远不要使用new类的类型。始终预先创建到池中。肖恩H解释说:http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx

另一件需要考虑的事情是,由于多次绘制调用,使用多个纹理可能导致sprite批处理速度变慢。尝试将多个粒子纹理合并为一个,并使用源矩形SpriteBatch.Draw参数。

+1

感谢Aranda - 你的后续provi德德一些有用的进一步阅读... – Paul