2011-08-27 128 views
15

我在寫一款使用C#2010和XNA 4.0的遊戲。我希望它是一個好遊戲,而不是一些「只是另一個垃圾」,所以我的目標之一是好幀率。爲此,我想問你一些建議,無論是XNA相關的還是C#相關的 - 我能做些什麼來加速我的代碼,從而提高FPS。XNA遊戲性能

下面是一些東西,我發現:使用array insted的的list<>將提高性能很多

  • (C#),如果你想訪問數據(甚至許多數額巨大:具有陣列20000個物品給幾乎180%FPS使用for代替foreach將提高性能的20000
  • (C#)名單。在相同的20000元就好像5-10%的差異。
  • (XNA和C#)調用方法性價比高,所以當我將代碼分散到meth中ods叫什麼其他方法等等,一切都非常酷,面向對象,每次調用1-3 FPS的成本。
  • (xna)更新與繪製:當我將代碼放入update()和draw()時,性能沒有區別,所以如果您不太在意,則不必在update()而不是把所有東西放在一起畫()以期望更好的FPS。
  • (xna)不知道它是我還是4.0,但是當你加載一個帶有很多紋理和相當複雜的網格的.X文件時,需要花費很多時間來加載。我不得不編寫自己的.X加載器和網格/模型渲染器,只是因爲XNA開始爲每個三角形加載紋理,而不管之前的紋理是否具有相同的紋理。即使編寫我自己的爲內容緩存紋理的內容加載器也不是解決方案,因爲它仍然被大量使用。如果你製作的東西不錯而蓬鬆,我建議使用drawuserprimitives而不是Model類。 (不知道它是4.0還是3.1也有這樣的性能問題)
  • (xna和c#)儘量避免在繪圖時使用「new」。我在網上看到了一些代碼,複製/粘貼了什麼,並且有「basicEffect = new BasicEffect(graphicsDevice);」和draw()中的這種醜陋,甚至更糟糕:在draw()中的迭代中。這樣會殺死性能。而不是在「遊戲」或靜態類中有一個這樣的類。這也適用於其他「臨時對象」:醜陋,但我認爲創建全局的東西並注意使用它會更好,然後製作一個漂亮而蓬鬆的代碼,因爲垃圾回收器會使我們的遊戲變得更加美觀。

好了,所以使長話短說,請在這裏發表一些好的建議,所以我/我們能好,速度快,優化遊戲;)

在此先感謝: Zéiksz

+0

看起來像一個很好的CW候選人:) – BlackBear

+1

我建議使這個社區維基。 – Ben

+3

我不買那使用堅實的OOP架構每次呼叫花費1-3 fps ... – Blindy

回答

5

UberGeekGames在XNA優化方面有很好的文章。它主要針對Xbox和WP7,但許多東西也適用於PC。

http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

原址是死的,但可在互聯網檔案:

Archived version of High end performance optimizations on the xbox 360 and windows phone7

經驗法則是 「優化前的個人資料」。

+0

+1我喜歡這個網站,感謝您的分享。 –

+6

網站似乎是死於截至8月24日。 – Inisheer

7

軟件優化是一種工藝。最佳的優化類型是基於收集的統計數據的證據。

直到遇到問題,請不要優化。難道你不認爲遊戲的可玩性比這個指標或其他指標更重要嗎?我的建議是首先製作遊戲,然後根據需要考慮它的表現不佳。

然後發佈一些具體問題,我相信你會在這裏得到一些關於具體問題的幫助。

同時,我建議您從遊戲開發書籍中獲得更多信息,例如:http://forums.create.msdn.com/forums/p/8642/45646.aspx

XNA Extereme 101 - 似乎是一個有趣的教程

+0

我同意預編程優化是否定的。但是,我認爲針對遇到此問題的人提出問題/答案會有所幫助。 –

+0

@erik我也同意這一點。這是收集這些信息的好地方。 –

+0

+1我完全同意這個答案。遇到性能問題的人幾乎肯定會做出嚴重錯誤的事情,應該運行分析器來查找它,或者發佈有關特定問題的信息。如果你遇到問題,合併你的一半方法調用是不會有幫助的。 –

7

我的2美分的價值:

不要把所有的代碼在一個方法,因爲你認爲它的成本要調用的方法。如果你認爲通過調用一個空方法失去1-3 FPS,你可能還沒有完成1-3的損失研究。爲了在空白方法調用期間實現這種損失,您必須在MANY數千...中擁有一個FrameRate ....您不會擔心自己會降低1-3級。

FPS是判斷XNA性能的壞方法。當啓用可變時間步時,操作系統所涉及的其他進程可能會影響幀速率。你真的需要配置文件。只需專注於通過使用System.Diagnostic.Stopwatch對象計時來完成更新& /或繪製方法所需的實際時間。分別計時,不合(非常重要)。

不應僅在繪圖調用中避免使用'新'關鍵字,而且在更新&的任何地方繪製...僅適用於參考類型。隨時隨地使用新關鍵字,以及使用值類型。