簡體   English   中英

OpenGL 上的多線程渲染

[英]Multithreaded Rendering on OpenGL

我有一個多線程應用程序,我試圖在其中使用不同的線程進行渲染。 首先,我嘗試在所有線程之間使用相同的渲染上下文,但我為其他線程獲取了 NULL 當前上下文。 我在互聯網上讀到一個上下文一次只能在一個線程中是最新的。

所以我決定做一些不同的事情。 我創建一個窗口,從中獲取 HDC 並創建第一個 RC。 之后,我在線程之間共享這個 HDC,並且在我創建的每個新線程中,我從同一個 HDC 獲取一個新的 RC,並使其成為該線程的最新版本。 每次我這樣做時,返回的 RC 總是不同的(通常是以前的值 + 1)。 我做了一個斷言來檢查wglGetCurrentContext()返回一個 RC,看起來它返回了剛剛創建的那個。 但是在進行渲染后,我沒有渲染,如果我調用GetLastError()我得到錯誤 6(句柄無效??)

那么,這是否意味着,盡管wglCreateContext()每次新調用都會給我一個新值,但不知何故這意味着所有這些不同的值對於 OpenGL 調用都是相同的“連接通道”?

這是否意味着我將始終必須使線程上的先前渲染上下文無效,並在新線程上激活它? 我真的必須一直保持同步,還是有其他方法可以解決這個問題?

我有一個多線程應用程序,我試圖在其中使用不同的線程進行渲染。

嘗試多線程渲染器將一無所獲 基本上你遇到了一個大的競爭條件,驅動程序將忙於同步線程以某種方式理解它。

為了獲得最佳渲染性能,請將所有 OpenGL 操作保持在一個線程中。 所有並行化都在 GPU 上免費進行。

我建議閱讀來自 OpenGL Consortium 的 以下 wiki 文章

簡而言之,這在很大程度上取決於您對 OpenGl 的多線程的含義,如果您有一個線程執行渲染部分而一個(或多個)執行其他工作(即 AI、物理、游戲邏輯等),則是完全正確。

如果您希望多個線程與 OpenGL 混淆,您不能,或者更好,您可以,但它確實會給您帶來更多的麻煩而不是優勢。

嘗試閱讀以下有關並行 OpenGL 使用的常見問題解答,以更好地了解此概念:

http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html

在某些情況下,在不同線程中使用多個渲染上下文可能是有意義的。 我使用這樣的設計從文件系統加載圖像數據並將這些數據推送到紋理中。

Mac OS X 上的 OpenGL 是單線程安全的; 啟用它:

#include <OpenGL/OpenGL.h>

CGLError err = 0;
CGLContextObj ctx = CGLGetCurrentContext();

// Enable the multi-threading
err =  CGLEnable( ctx, kCGLCEMPEngine);

if (err != kCGLNoError ) {
     // Multi-threaded execution is possibly not available
     // Insert your code to take appropriate action
}

請參閱: 並發和 OpenGL - Apple Developer

以及: 技術問答 QA1612:OpenGL ES 多線程和...

https://www.imaginationtech.com/blog/understanding-opengl-es-multi-thread-multi-window-rendering/

什么時候不應該使用多線程渲染?

當您不受 CPU 限制或加載時間不是問題時。

因此,如果您的 CPU 受限,請單獨其他線程來執行 CPU 受限的工作,例如編解碼器、紋理上傳、計算...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM