2011-08-23 133 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