2009-04-22 4 views
6

Momentan lade ich ein Bild in den Speicher eines zweiten Threads und lade dann während der Display-Schleife (wenn eine Texturladung erforderlich ist) die Textur.Was ist eine gute Möglichkeit, Texturen in OpenGL dynamisch zu laden?

Ich entdeckte, dass ich die Textur im 2. Thread nicht laden konnte, weil OpenGL das nicht mochte; vielleicht ist das möglich, aber ich habe etwas falsch gemacht - also bitte korrigiert mich, wenn das tatsächlich möglich ist.

Auf der anderen Seite, wenn mein Fehler gültig war - wie lade ich eine Textur, ohne die Rendering-Schleife zu stören? Gegenwärtig benötigen die Texturen ungefähr 1 Sekunde, um aus dem Speicher geladen zu werden, und obwohl dies kein großes Problem darstellt, kann es für den Benutzer leicht irritierend sein.

+0

Das scheint eine außergewöhnlich lange Zeit zu sein, um eine Textur aus dem Systemspeicher in VRAM zu laden. Wie groß ist es und haben Sie OpenGL Mipmap Ebenen für Sie generieren? –

+0

Sehr groß, sie sind medizinische Bilder. –

Antwort

4

Sie können eine Textur von der Festplatte in einen beliebigen Thread laden, indem Sie ein beliebiges Werkzeug zum Lesen der Dateien verwenden.

Wenn Sie es jedoch an OpenGL binden, muss es im selben Thread wie das Rendering für diesen OpenGL-Kontext behandelt werden. Davon abgesehen schlägt this discussion vor, dass die Verwendung eines PBO in einem zweiten Thread eine Option ist und den Prozess beschleunigen kann.

+0

Erster Absatz nicht so hilfreich, Art zu wiederholen, was ich gesagt hehe;) aber der 2. Absatz sieht sehr hilfreich aus, danke für den Link! Ich werde es auf jeden Fall überprüfen :) –

+0

Ich sage nur, dass das, was Sie dort gemacht haben, gültig ist - ich war mir nicht sicher, wie Sie es geschrieben haben, ob das der Fall war. Viel Glück! –

+0

Verstanden. Vielen Dank! :) –

1

Sie können sicherlich die Textur von der Festplatte in RAM in beliebig vielen Threads laden, aber OpenGL wird nicht in mehreren Threads in VRAM hochgeladen, aus dem Grund, der in Reeds Antwort erwähnt wird.

Da das Laden von der Festplatte ist der langsamste Teil, das ist das Bit, das Sie wahrscheinlich wollen, Thread. Die Lade-Threads bauen eine Warteschlange von Texturen auf, die hochgeladen werden sollen. Diese Warteschlange wird dann von dem Thread verbraucht, der den GL-Kontext besitzt (beachten Sie jedoch, dass Sie von den verschiedenen Threads auf diese Warteschlange zugreifen). Sie können auch einen Ansatz ohne Threads berücksichtigen, bei dem N Texturen pro Frame hochgeladen werden, wobei N eine Zahl ist, die das Rendering nicht zu sehr verlangsamt.

+0

@Justin, danke, dass du dir die Zeit genommen hast zu antworten. Vielleicht ist meine Frage schlecht formuliert; Zur Zeit erfolgt das Hochlast-Laden im zweiten Thread (das dauert etwa 10 Sekunden, da eine Bildverarbeitung erforderlich ist), dann dauert es nur einen kurzen Moment, um die Pixel während der GLUT-Schleife in den VRAM zu kopieren; Obwohl es kurz ist, benötigt es eine "unbequeme" Menge an Zeit in Bezug auf die Benutzererfahrung. –

+0

Okey, das macht Sinn - posten Sie hier eine Antwort, wenn Sie herausfinden, was für Sie funktioniert! – Justicle

Verwandte Themen