2 Stimmen

OpenGL Threaded Tile Texture Loading mit Qt 4.5 / 4.6

Ich versuche, an meiner Universität eine Kartenanwendung für wissenschaftliche Zwecke zu entwickeln. Dazu habe ich Zugang zu einer Menge von Kacheln (256x256). Ich kann auf sie zugreifen und sie in einem QImage in einem separaten QThread speichern. Mein Problem ist, wie kann ich es schaffen, das QImage in eine Textur innerhalb des separaten QThreads (nicht des GUI-Hauptthreads) zu laden? Oder noch besser, geben Sie mir einen Tipp, wie ich dieses Problem angehen kann.

Ich dachte über multithreaded OpenGL, aber ich brauche auch OpenGL Kommissionierung und ich habe nicht über etwas Nützliches für that.# fallen.

Zeigen Sie mir einen nützlichen Beispielcode, wenn Sie möchten, ich bin dankbar für alles, was sich unter Linux kompilieren lässt :)

Hinweis1: Ich verwende ereignisbasiertes Rendering, also nur wenn sich die Szene ändert, wird sie neu gezeichnet. Anmerkung2: OSG ist KEINE Option, es ist viel zu schwer für diesen Zweck, ein leichtgewichtiger Ansatz wird benötigt. Anmerkung3: Die Anwendung ist komplett in C++ geschrieben.

Danke für jede Antwort. P.S. Bitte haben Sie Geduld, ich bin nicht so fortgeschritten, wie dieses Thema vielleicht vermuten lässt.

2voto

ypnos Punkte 47895

OpenGL ist nicht thread-sicher. Sie können immer nur einen GL-Kontext in einem Thread verwenden. Je nach Betriebssystem müssen Sie auch explizit das Kontext-Handle in einem Thread aufgeben, um es in einem anderen zu verwenden.

Sie können das Laden von Texturen nicht durch Threading beschleunigen, da der Engpass hier die Bandbreite zur Grafikkarte ist.

Lassen Sie Ihre Lieferfäden, die die Kacheln laden, einen Ringspeicher auffüllen. Der GL-Thread speist sich aus dem Ringpuffer. Mit zwei Mutexen ist es einfach, den Ringpuffer zu kontrollieren, um diesen Vorgang thread-sicher zu machen.

Das wäre mein Vorschlag.

1voto

João Barbosa Punkte 11

Zwei Tricks, mit denen ich die Dinge beschleunige:

  • Pixelpuffer-Objekte: Abbildung des GPU-Speichers, damit der Lade-Thread direkt auf die GPU schreiben kann;
  • Sync-Objekte: mit einem Sync-Objekt weiß ich, wann die Textur wirklich bereit ist, verwendet zu werden (glTexImage2D mit PBO ist asynchron, so dass es keine Garantie dafür gibt, dass die Textur bereit ist, gebunden zu werden, d.h. wenn eine Textur gebunden wird, blockiert sie, wenn DMA die Aktualisierung der Texturdaten nicht abgeschlossen hat)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X