2011-04-27 53 views
3



我想優化我的基本XNA引擎。結構有點像這樣:我有一個GameWorld實例和更多的GameObjects附加到它。現在,在每一幀中,我都會在GameObjects之間做一個循環,然後我在裏面調用draw方法。這個實現的概念是GameDevice繪圖函數被多次調用,每個對象一個。
現在,我想減少繪圖調用,實現一個結構,在調用繪圖方法之前,將大型矢量中的所有幾何圖形轉換爲所有頂點數據,並執行一次繪圖調用以繪製所有頂點數據。

這是一種有效的方法嗎?有人可以告訴我一個優化的解決方案嗎?

感謝
在基本的XNA引擎中優化繪圖調用

+0

你有沒有讀過[這篇文章在遊戲開發網站上](http://gamedev.stackexchange.com/questions/9277/optimizing-an-xna-2d-game/9289#9289)? – 2011-04-27 12:14:57

+0

其實我沒有,謝謝鏈接,:) – Archedius 2011-04-27 12:23:55

回答

6

的第一步是減少你正在繪製的對象的數量。有很多方法可以做到這一點,最常見的:

  1. 域剔除 - 即剔除視錐外的所有對象

  2. 場景查詢 - 例如使用BSP樹或QuadTree組織場景 - 某些數據結構可讓您減少潛在可見對象集合

  3. 遮擋剔除 - 更高級的主題,但在某些情況下,您可以確定某個對象不可見因爲它被其他幾何體遮擋。

在網絡上有大量的教程涵蓋了所有這些。我會按照上面的順序攻擊它們,現在可能會忽略遮擋剔除。任何圖形引擎中最重要的優化是,繪製最快的圖元是你不需要繪製的圖元。

一旦你有潛在可見的一組對象,把它們全部發送給GPU是很好的,但是你必須確保你以最小化GPU狀態變化的方式來做 - 例如,將所有使用相同紋理/材質屬性的對象組合在一起。

一旦完成,你會發現一切都非常快。當然,你可以隨時採取進一步行動,但上述步驟可能是最好的開始。

只是爲了清楚地說明一點 - 不要只假定較少的繪圖調用=更快。當然,這取決於很多因素,包括硬件,但通常XNA/DirectX API在通過流水線排隊幾何時相當不錯 - 畢竟這就是它的目的。關鍵並不是最小化調用,而是儘量減少場景中所需的狀態變化(紋理/着色器等)。

+0

很明確的答案,千萬謝謝! :) – Archedius 2011-04-27 12:22:27

+4

實際上,對「Draw Primitives」函數調用的次數或多或少直接映射到發送給GPU的批次數。批次是CPU限制。一般來說,目前GPU可以比CPU能夠更快地切換狀態。最大限度地減少狀態變化是非常*舊的性能建議。它只適用於這些日子,因爲任何國家的變化都需要新的批次。 – 2011-04-27 13:02:31

+0

@Andrew。感謝您的評論。我想我會同意,但建議仍然是最新的,並且在微軟幫助DirectX 11(我對XNA不太熟悉)方面。我想這取決於你的出發點在哪裏。如果你已經將你的引擎開發到了每個Draw Primitive調用都是狀態改變的地步,那麼我會同意更多。但我不認爲OP還在那裏。 – 2011-04-28 16:19:00