2012-01-10 24 views
8

當你在遊戲世界中移動時,我正在開發一個大型遊戲,它在關卡數據(包括着色器)中流動。我不希望因爲着色器編譯/鏈接或第一次使用它們而導致幀速率下降。您是否可以使用自己的上下文對後臺線程預着色?

我有我的着色器編譯和鏈接工作在一個單獨的線程與自己的開放的上下文。但是我還沒有能夠預言着色器在單獨的線程上工作(所以在着色器第一次使用時沒有性能問題)。

在iOS或OpenGL文檔中,預熱功能在任何地方都沒有提及。然而,在OpenGL ES分析器(從xcode分析時可用的一種儀器)中提到了這一點。在這個工具中,我得到了一個「預編譯階段之外編譯的着色器」警告,每次渲染某個着色器之前都沒有用過渲染過的着色器。 「擴展細節」如下所示:

「OpenGL ES Analyzer檢測到不屬於初始預熱階段的着色器編譯。爲避免它們,預先渲染所有用於着色的着色器。要做到這一點,當應用程序啓動時進行預熱,並且使用每個着色器程序執行繪圖調用,使用着色器程序將使用的任何gl狀態設置。混合,顏色遮罩,邏輯ops,multisamping,紋理格式和點原始狀態都可以影響着色器編譯。「

術語「編譯」在這裏有點混淆。頂點和片段着色器已經被編譯並且程序已經被鏈接。但是,第一次使用給定的OpenGL狀態渲染某些東西時,它會在着色器上做更多的工作來優化它,我猜想。

我有代碼在第一次使用之前渲染一個零大小的三角形預先着色着色器。

如果我使用與普通渲染相同的Open GL上下文對主線程上的着色器進行編譯,鏈接和預加熱,那麼它將起作用。但是,如果我在背景線程上使用單獨的Open GL上下文執行它,它將不起作用(它在第一次使用時仍然會收到分析器警告)。

所以......它可能是在單獨的上下文中預渲染着色器對其他上下文沒有影響。或者可能是因爲我沒有完全相同的狀態來設置單獨的上下文。可能需要設置很多潛在的Open GL狀態。我在後臺線程上使用屏幕外渲染緩衝區,以便可以將其視爲狀態的一部分。

有沒有人成功地在後臺線程上獲得預感?

回答

6

說實話,在昨天之前,我對這件事情一無所知,儘管我一直在做我的引擎優化工作。所以,首先,謝謝你的提示:)。

從那時起,我研究了着色器變暖主題,但我還沒有發現太多東西。

我找到一提名爲「ATI的OpenGL編程和優化指南」的文件在AMD官方文檔:

http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&ved=0CEoQFjAF&url=http%3A%2F%2Fdeveloper.amd.com%2Fmedia%2Fgpu_assets%2FATI_OpenGL_Programming_and_Optimization_Guide.pdf&ei=3HIeT_-jKYbf8AOx3o3BDg&usg=AFQjCNFProzLiXf5Aqqs4jZ2jOb4x0pssg&sig2=6YV7SVA97EFglXv_SX5weg

這是其中指着色變暖的摘錄:

引用:

雖然R500本身支持在片段着色單元的流量控制,R300和R400的ASIC 不。 R300和R400的靜態流量控制由驅動程序編譯出 未使用的條件並根據設置的常量展開循環來模擬。儘管R500 asics系列本身支持流量控制,但驅動程序仍會嘗試編譯靜態流量條件,使其能夠重組着色器指令以實現更好的指令調度。驅動程序還會嘗試將 緩存爲針對特定靜態流條件編譯的着色器,以便預期重用。因此,當編寫使用靜態流控制的片段程序時,建議通過在使用與着色器生命週期相關的常見靜態條件 排列的第一幀上渲染虛擬三角形來「着色」着色器高速緩存 。

我已經發現身邊最好的解釋是:

http://fgiesen.wordpress.com/2011/07/01/a-trip-through-the-graphics-pipeline-2011-part-1/

報價:

順便說一句,這也是爲什麼你會經常看到的延遲,你第一次使用的原因一個新的着色器或資源;很多創建/編譯工作都由驅動程序推遲,只有在實際需要時纔會執行(您不會相信某些應用程序創建了多少未使用的廢話!)。圖形程序員知道故事的另一面 - 如果你想確定一些東西是真正創建的(而不是僅僅保留內存),你需要發出一個虛擬繪製調用,用它來「加熱」。醜陋而令人討厭,但自1999年我開始使用3D硬件以來就是這種情況 - 這意味着,從這一點來看,它幾乎是一個生活中的事實,所以要習慣它。 :)

在本演示文稿中,提到了cryteck引擎如何在遠程引擎上執行它,儘管它主要與DirectX相關。

http://www.powershow.com/view/11f2b1-MzUxN/Far_Cry_and_DirectX_flash_ppt_presentation

我希望這些鏈接以某種方式幫助。

+0

感謝您的聯繫。我意識到PC上也存在這個問題。我更感興趣的是OpenGL ES上人們對此的體驗。如果有人在iOS或其他OpenGL ES平臺上進行了這項工作,那麼這將非常有用。否則,我將不得不求助於開發一個系統,在該系統中,我可以預先計算可以在某個關卡中使用的所有着色器以及它們在哪個上下文中使用 - 然後在初始加載過程中預熱它們。 – Namaste 2012-01-26 22:53:33

+0

Ati的鏈接已過期。新建:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/ATI_OpenGL_Programming_and_Optimization_Guide.pdf – 2014-08-25 10:33:55

相關問題