我的問題:緩存Outputimages在OpenGLES 2.0
我有一個視頻(帶可以說25FPS),其具有與屏幕上opengles 2.0渲染。 爲了閱讀視頻,我使用了一個解碼器,將視頻解碼爲opengl es紋理。使用渲染通道,我在屏幕上繪製這個紋理。
我所要做的就是從解碼器中獲取圖像,將其上傳到GPU,調用shaderprogram並在屏幕上渲染圖像。如果視頻有25FPS,我必須以40ms步長(1000ms/25FPS)更新屏幕。
在每個步驟中我有待辦事項以下:
- 從解碼器獲得的圖像
- 推它到GPU存儲器
- 渲染屏幕
- 交換緩衝器
到目前爲止它正在工作。 現在它發生了,解碼器花費超過40ms的時間來解碼一幀。這並不是一直髮生,但有時會發生。
解決方案將構建緩存。也就是說,在顯示第一張圖片之前,我會渲染5張圖片。這帶來了一個問題,它必須發生異步,所以可以構建緩存並同時渲染屏幕。如果發生這種情況,您可以在視頻中看到它,因爲它不再「流暢」。
我的問題:
- 是否有一個解決方案?
- 是否有可能創建一個?緩衝區,可以在渲染表面的後緩衝區上覆制(?!),以便我可以使用該類緩衝區創建緩存,並將其複製到後緩衝區而不會阻塞其他正在創建這個緩衝區的線程?
OR
- 如何填補另一個緩衝區後備緩衝?
我已經試過:
- 渲染幀緩衝(紋理)的緩存。這個工作幾乎完美,除了紋理也必須被渲染。這意味着(因爲它是異步的),如果構建一個緩存幀併爲屏幕創建圖像,則必須互斥(/同步)渲染方法,否則程序會崩潰。但是,同步處理需要完成異步操作。所以這不是一個好的解決方案。
說明:從兩個線程使用OpenGL ES可能會非常棘手。它「僅適用於上傳/繪製」(至少在iOS和Nvidia Tegra上)。 如果您的設備不允許這樣做,則必須將OGL上下文包裝在一個互斥鎖中。在調用OGL之前,每個線程都會重新綁定上下文。 技巧保持快速: 。測試上下文是否綁定到線程;只在需要時重新綁定。 。預先分配紋理。 。不要刪除紋理;重新使用它們。 。如果您的設備允許,則直接解碼到紋理內存中(跳過glTexSubImage2D)。 然後解碼線程調用最多1個OGL方法(紋理上傳)。爭用將會很低。 –