2014-10-22 49 views
1

我的同事和我正在研究視頻渲染引擎。多個孤立的OpenGL上下文是否影響性能

整個想法是解析配置文件並將每幀渲染到離屏FBO,然後使用glReadPixel獲取幀渲染結果以進行視頻編碼。

我們試圖通過創建兩個線程來優化渲染速度,每個線程都有一個獨立的OpenGL上下文。一個線程渲染奇數幀,另一個渲染偶數幀。這兩個線程不共享任何gl資源。

結果相當混亂。在我的電腦上,與我們的單線程實現相比,渲染速度有所提高,而在我的合作伙伴的計算機上,整個速度下降。

我在這裏想知道,OpenGL上下文的數量如何影響整體性能。如果不共享任何東西,創建多個OpenGL線程真的是一個好主意。

回答

4

上下文切換當然不是免費的。與性能相關的問題一樣,通常無法量化。如果你想知道,你需要在你關心的系統上進行測量。它可能相當昂貴。

因此,您使用多個上下文添加了一定量的開銷。如果付出的代價取決於你的瓶頸在哪裏。如果您已經通過單個CPU線程進行GPU限制,您將無法獲得任何收益,因爲如果GPU已經完全加載,無法讓GPU更快地完成工作。因此,你爲上下文切換增加開銷而沒有任何收益,並且使整個事情變得更慢。

如果您受CPU限制,使用多個CPU線程可以減少總體使用時間。如果CPU工作的並行化與增加的同步和上下文切換開銷一起導致總淨增益再次取決於您的用例和特定系統。嘗試兩種方法和衡量是唯一的好事。

根據您的問題描述,您可能還可以使用多線程同時還具有一個OpenGL上下文堅持,並保持所有的OpenGL在一個線程調用。而不是使用glReadPixels()同步的,你可以把它讀成公益組織(像素緩衝區對象),它允許您使用異步讀取。這將GPU和CPU的工作分解得更好。如果你還沒有這樣做,你也可以在單獨的線程上進行視頻編碼。這種方法需要一些線程間同步,但是它避免了使用多個上下文,同時仍然使用並行處理來完成工作。

+0

感謝您的回覆,這個答案真的爲我指出了道路。視頻編碼是在單獨的線程上完成的。而且我不使用PBO是因爲我的目標設備OpenGL版本不支持它。 – TwilightSun 2014-10-22 06:47:03

+1

@TwilightSun:天哪,你的目標設備有多大?OpenGL實現如果不支持PBO?這個功能是古老的東西,由不到10年的一切支持。你可能不得不使用OpenGL擴展,但你很難找到一個現在不支持它的實現。 – datenwolf 2014-10-22 07:49:16

相關問題