3

我有一个使用基本 spritebatch 的粒子系统,其中基于递减的 alpha 值创建和销毁粒子,直到 0。

系统的性能在 pc 上很差,在 xbox 上也很差,在 fps 显着减慢之前屏幕上有大约 100 个粒子,我已经阅读了有关如何提高性能的信息,但有没有人有任何关于如何实现的提示他们,例如什么是最好的方法来重用粒子而不是kill()?每个粒子的图像大小是否有所不同?如果我不旋转每个粒子会有帮助吗?

我已经尝试过这些建议中的每一个,但没有得到任何显着的改进——有没有人有任何建议——值得使用 gpu 而不是基于 cpu 吗?

4

2 回答 2

4

据我回忆,破坏和创建粒子会大大降低性能。您可能想要重用粒子。

只要图像不是很大,就不确定图像大小或旋转会大大降低性能。

我会有一个将死粒子交换到活动粒子末端的阵列,因此只处理活动粒子。

例如:

制作一个MAX粒子数组;
当你需要一个粒子抓取时,particle_array[count];
递增计数。
当一个粒子死亡时,减少计数,用particle_array[count]交换粒子;
只更新计数粒子;

希望这可以帮助。

于 2011-08-23T18:20:20.837 回答
1

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

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

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

于 2011-08-24T01:31:01.780 回答