Der zeitaufwendigste Teil des Texturladens ist normalerweise der Plattenzugriff und jede Formatkonvertierung, die beide unabhängig von OpenGL sind und daher sicher auf einem anderen Thread stattfinden können. Sobald die Textur in den Speicher und in das gewünschte Format eingelesen wurde, ist die eigentliche Kopie in einen OpenGL-Puffer ziemlich schnell.
Der Einstieg in die Details der Thread-Programmierung ist für diese Antwort völlig zu komplex, aber es gibt ein gutes Stück Dokumentation, und sobald es in Ihrem Kopf klickt, ist es ziemlich einfach (wie Zeiger und Speicher).
Das allgemeine Konzept besteht darin, eine Liste von Texture Holder-Objekten zu erstellen (z. B. die Datei/den Namen, einen initially-null-Puffer und ein loading-complete-Flag) und diese an Ihren Lade-Thread zu übergeben . Der Lade-Thread durchläuft dann die Liste, öffnet jede Datei, lädt sie in den Speicher und hängt den Puffer an den Listeneintrag an, setzt dann das geladene Flag und inkrementiert möglicherweise einen Zähler. Der Haupt-Thread übernimmt die neu geladene Textur, kopiert sie in eine OpenGL-Textur und erhöht den Fortschrittsbalken oder was auch immer Ihr Lade-Indikator ist. Sobald alle Texturen in der Liste Puffer haben und als geladen markiert sind, ist die Arbeit des anderen Threads beendet und kann gestoppt werden (oder belassen, um zukünftige Texturen zu laden).
Der Hauptvorteil dieses Modells liegt darin, dass Sie nicht den tatsächlichen Grafikkontext teilen müssen. In APIs, die threadsicher (DirectX) sein können, ist dies mit einer Leistungseinbuße verbunden, und OpenGL erfordert von Ihnen eine ordentliche Arbeit, um mehrere Kontexte zu haben oder sicherzustellen, dass Sie sie korrekt teilen. Das schwere Heben beim Laden von Texturen ist normalerweise das Lesen von Dateien und das Überprüfen von Parametern, es sei denn, Sie konvertieren oder rotieren im Format, was sogar den Festplattenzugriff beeinträchtigen kann. Die tatsächliche Kopie in den Videospeicher ist stark optimiert und stellt wahrscheinlich keinen Engpass dar (wenn Sie sich darüber Sorgen machen, versuchen Sie, ein Tool zu erstellen, das GPU-Anrufkosten erkennt und sehen kann). Nichts davon hängt direkt von OpenGL ab, also können Sie es ohne großen Aufwand in einen anderen Thread verschieben.
Wenn Sie speziell Windows verwenden, gibt es eingebaute Threading-Funktionen, die verwendet werden können. Sie arbeiten mit einem einfachen Callback-Modell (stellen Sie eine Funktion und erste Parameter, in diesem Fall Ihre Texturliste, zur Verfügung Anruf). Ich bin nicht persönlich vertraut mit C++ 11 Threading-Unterstützung oder wie es in Visual Studio funktioniert, wenn überhaupt, so dass Sie das überprüfen müssen.
Eigentlich OpenGL und OpenGL-Kontexte ** sind ** thread sicher. Sie können nur einen einzigen Kontext in mehreren Threads gleichzeitig aktiv haben. – datenwolf