wake-up-neo.net

Multithread-Rendering unter OpenGL

Ich habe eine Multithread-Anwendung, in der ich versuche, mit verschiedenen Threads zu rendern. Zuerst habe ich versucht, den gleichen Rendering Context zwischen allen Threads zu verwenden, aber ich erhielt NULL aktuelle Kontexte für andere Threads. Ich habe im Internet gelesen, dass ein Kontext immer nur zu einem Thread aktuell sein kann.

Also entschied ich mich, etwas anderes zu machen. Ich erstelle ein Fenster, ich bekomme den HDC daraus und erstelle den ersten RC. Danach teile ich diesen HDC zwischen Threads und in jedem neuen Thread, den ich erstelle, erhalte ich eine neue RC vom selben HDC und mache ihn für diesen Thread aktuell. Jedes Mal, wenn ich es tue, ist die zurückgegebene RC immer anders (normalerweise der vorherige Wert + 1). Ich mache eine Assertion, um zu überprüfen, ob wglGetCurrentContext() eine RC zurückgibt, und es sieht so aus, als würde sie die gerade erstellte zurückgeben. Aber nachdem ich das Rendering gemacht habe, bekomme ich kein Rendering und wenn ich GetLastError() anrufe, erhalte ich Fehler 6 (ungültiges Handle ??).

Bedeutet das also, dass mir trotz jedes neuen Aufrufs von wglCreateContext() ein neuer Wert angezeigt wird, bedeutet dies irgendwie, dass alle diese verschiedenen Werte den gleichen "Verbindungskanal" zu den OpenGL-Aufrufen haben?

Bedeutet das, dass ich den vorherigen Rendering Context für einen Thread immer ungültig machen und für den neuen aktivieren muss? Ich muss diese Synchronisierung wirklich ständig machen, oder gibt es eine andere Möglichkeit, um dieses Problem zu lösen?

15
filipehd

Ich habe eine Multithread-Anwendung, in der ich versuche, mit verschiedenen Threads zu rendern.

NICHT !!!

Sie erhalten nichts von dem Versuch, Ihren Renderer zu multithreaden. Im Grunde laufen Sie in eine große Wettlaufsituation, und der Fahrer wird gerade damit beschäftigt sein, die Threads zu synchronisieren, um ihn irgendwie zu verstehen.

Um eine optimale Renderleistung zu erzielen, sollten Sie alle OpenGL-Vorgänge nur in einem Thread ausführen. Alle Parallelisierung erfolgt kostenlos auf der GPU.

46
datenwolf

Ich schlage vor, den folgenden Wiki-Artikel des OpenGL-Konsortiums zu lesen.

http://www.opengl.org/wiki/OpenGL_and_multithreading

In einfachen Worten, es hängt viel davon ab, was Sie für Multi-Threading in Bezug auf OpenGl bedeuten. Wenn Sie einen Thread für den Rendering-Teil haben und einen (oder mehrere) andere Jobs (z. B. KI, Physik, Spielelogik usw.) ausführen ein vollkommen recht.

Wenn Sie mehrere Threads mit OpenGL durcheinander bringen möchten, können Sie dies nicht tun, oder besser, Sie könnten dies tun, aber es wird Ihnen wirklich mehr Probleme als Vorteile bringen.

Versuchen Sie, das folgende FAQ über parallele OpenGL-Verwendung zu lesen, um eine bessere Vorstellung von diesem Konzept zu erhalten:

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

14

In einigen Fällen kann es sinnvoll sein, mehrere Rendering-Kontexte in verschiedenen Threads zu verwenden. Ich habe ein solches Design verwendet, um Bilddaten aus dem Dateisystem zu laden und diese Daten in eine Textur zu verschieben.

5
JoR

OpenGL unter Mac OS X ist Single-Thread-sicher. um es zu aktivieren:

#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
}

Siehe: Parallelität und OpenGL - Apple Developer

Und: Technische Fragen und Antworten QA1612: OpenGL ES Multithreading und ...

0
geowar