我想優化我的基本XNA引擎。結構有點像這樣:我有一個GameWorld實例和更多的GameObjects附加到它。現在,在每一幀中,我都會在GameObjects之間做一個循環,然後我在裏面調用draw方法。這個實現的概念是GameDevice繪圖函數被多次調用,每個對象一個。
現在,我想減少繪圖調用,實現一個結構,在調用繪圖方法之前,將大型矢量中的所有幾何圖形轉換爲所有頂點數據,並執行一次繪圖調用以繪製所有頂點數據。
這是一種有效的方法嗎?有人可以告訴我一個優化的解決方案嗎?
感謝
在基本的XNA引擎中優化繪圖調用
回答
的第一步是減少你正在繪製的對象的數量。有很多方法可以做到這一點,最常見的:
域剔除 - 即剔除視錐外的所有對象
場景查詢 - 例如使用BSP樹或QuadTree組織場景 - 某些數據結構可讓您減少潛在可見對象集合
遮擋剔除 - 更高級的主題,但在某些情況下,您可以確定某個對象不可見因爲它被其他幾何體遮擋。
在網絡上有大量的教程涵蓋了所有這些。我會按照上面的順序攻擊它們,現在可能會忽略遮擋剔除。任何圖形引擎中最重要的優化是,繪製最快的圖元是你不需要繪製的圖元。
一旦你有潛在可見的一組對象,把它們全部發送給GPU是很好的,但是你必須確保你以最小化GPU狀態變化的方式來做 - 例如,將所有使用相同紋理/材質屬性的對象組合在一起。
一旦完成,你會發現一切都非常快。當然,你可以隨時採取進一步行動,但上述步驟可能是最好的開始。
只是爲了清楚地說明一點 - 不要只假定較少的繪圖調用=更快。當然,這取決於很多因素,包括硬件,但通常XNA/DirectX API在通過流水線排隊幾何時相當不錯 - 畢竟這就是它的目的。關鍵並不是最小化調用,而是儘量減少場景中所需的狀態變化(紋理/着色器等)。
很明確的答案,千萬謝謝! :) – Archedius 2011-04-27 12:22:27
實際上,對「Draw Primitives」函數調用的次數或多或少直接映射到發送給GPU的批次數。批次是CPU限制。一般來說,目前GPU可以比CPU能夠更快地切換狀態。最大限度地減少狀態變化是非常*舊的性能建議。它只適用於這些日子,因爲任何國家的變化都需要新的批次。 – 2011-04-27 13:02:31
@Andrew。感謝您的評論。我想我會同意,但建議仍然是最新的,並且在微軟幫助DirectX 11(我對XNA不太熟悉)方面。我想這取決於你的出發點在哪裏。如果你已經將你的引擎開發到了每個Draw Primitive調用都是狀態改變的地步,那麼我會同意更多。但我不認爲OP還在那裏。 – 2011-04-28 16:19:00
- 1. 優化App引擎的圖像回覆
- 2. 在asp.net中優化搜索引擎
- 3. 繪圖 - 優化
- 4. 體素引擎和優化
- 5. 隱藏圖片庫的文本 - 搜索引擎優化
- 6. XNA在引擎蓋下?
- 7. 優化GDI +繪圖?
- 8. 如何在搜索引擎優化
- 9. python腳本優化的應用程序引擎
- 10. 搜索引擎優化的在線文本遊戲
- 11. TIMTHUMB.PHP如何影響一個網站的搜索引擎優化,或者圖像搜索引擎優化
- 12. 搜索引擎優化的單個視圖AngularJS應用程序
- 13. 優化地圖繪圖
- 14. mod_rewrite的網址,搜索引擎優化
- 15. 優化JBPM5引擎的性能
- 16. 爲Gecko引擎優化的jQuery庫
- 17. Laravel的搜索引擎優化5.4
- 18. 尋找3D XNA引擎
- 19. 粒子引擎 - XNA/C#
- 20. 節點中的基本html引擎
- 21. 搜索引擎優化:燈箱圖片對於搜索引擎不可見
- 22. 設置自定義搜索引擎優化標題使用Yoast WordPress的搜索引擎優化API
- 23. 基於XNA體素的地形引擎的任何好資源?
- 24. 如何優化WPF中的Canvas繪圖?
- 25. XHTML和搜索引擎優化
- 26. JavaScript鏈接和搜索引擎優化?
- 27. ASP.NET - 搜索引擎優化友好?
- 28. 硬刷新和搜索引擎優化
- 29. Zend Framework搜索引擎優化
- 30. Javascript和搜索引擎優化
你有沒有讀過[這篇文章在遊戲開發網站上](http://gamedev.stackexchange.com/questions/9277/optimizing-an-xna-2d-game/9289#9289)? – 2011-04-27 12:14:57
其實我沒有,謝謝鏈接,:) – Archedius 2011-04-27 12:23:55