2010-11-15 102 views
2

好吧,我有其中有各種由程序的其餘部分稱爲特殊功能的渲染器類:渲染效率

  • DrawBoxFilled
  • DrawText的
  • 的DrawLine
  • 約30多..

這些函數中的每一個函數調用glBegin/glEnd可分離,我知道這可能是非常低效(甚至不推薦使用)。因此,無論如何,我正計劃對渲染器進行全面重寫,並且我需要知道設置函數的最有效方法,以便當某個東西調用它時,它立即全部繪製它,或者其他任何需要這樣做的東西運行大多數有效。在此先感謝:)

+0

你的應用程序做了什麼?它需要繪製什麼?你爲什麼單獨繪製文本和線條? – jalf 2010-11-15 01:09:56

+0

該程序設置爲一系列狀態。每個狀態需要繪製不同的對象,如文本,框或其他東西。 Like Singleton :: get()。drawText(「Yea ...」,10,10); – Matt 2010-11-15 01:24:44

+0

這個場景有多頻繁?何時添加或刪除對象?每幀,或者僅當改變狀態時(我認爲這種情況有點罕見) – jalf 2010-11-15 01:33:51

回答

4

最有效的方法是不暴露這樣的低級別的方法。相反,你想要做的是構建一個scene graph,它是一個包含整個場景表示的數據結構。你在你的「更新」方法中更新場景圖,然後在「渲染」方法中一次渲染整個場景。

另一種略有不同的方法是每幀重新構建整個場景圖。這具有的優點是,一旦構成場景圖形,它不會改變。所以你可以在你的「更新」方法正在進行的同時在另一個線程上調用你的「渲染」方法,同時爲下一個幀構造場景。

如果沒有完整的場景圖,許多更高級的效果根本無法實現。例如,你不能做陰影貼圖(它需要你從不同的角度多次渲染場景),你不能做延遲渲染,它也會使任何依賴排序繪製順序的東西(例如,alpha混合)非常困難。

從您的方法名稱看,它看起來像是在2D中工作,因此雖然陰影貼圖在功能列表中可能不高,但alpha混合延遲渲染可能會是。

6

渲染的有效方式通常是使用VBO(頂點緩衝區對象)來存儲頂點數據,但只有在渲染(大部分)靜態數據時纔有意義。

不知道更多關於你的應用程序應該渲染什麼,很難說你應該如何構造它。但理想情況下,您不應繪製單個基元,而應繪製頂點緩衝區的內容(子集)。