Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Hi,
versuche gerade Texturen in einem SDL_Thread zu laden.
Das geht auch solange gut, bis ich die OpenGL zum Erstellen der Textur im Thread ausführe.
Diese geben mir jedesmal GL_INVALID_OPERATION zurück.
Das Syncronisieren mit den glBegin-glEnd-Blöcken bzw. das Auskommentieren aller anderen OpenGL-Funktionen löste dieses Problem nicht.
Als Alternative würde mir hier noch einfallen, dass es auf OpenGL nicht zugreifen könnte.
OpenGL ist zu dem Zeitpunkt initialisiert und der Thread wird im selben Speicherbereich wie das Hauptprogram gestartet und hat auch Zugriff auf den Bereich.
Aktuelle Lösung:
Nur das Laden der Daten in den Speicher wird über den Thread gemacht, dass finale Erstellen der Texturen erfolgt im Hauptprogramm.
Funktioniert, ist aber nicht die Lösung, da das finalem Erstellen noch zu lange dauert und man Ruckler feststellen kann
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wobei ich nicht weiß ob es sinnvol ist, wenn du aus einem anderen Thread heraus "die Macht" an dich reißt und da Texturen zwischenschiebst. Wenn der gerade beim Rendern ist könnte ich mir vorstellen, dass das arge Probleme mit sich bringt, wenn der Threadkontext sich ändern und da mal locker flockig eine Textur zwischengeschoben wird. Vor allem auch, wenn du es synchronisieren würdest würde der Renderthread ja stehen. Und so hättest du es auch gleich im Renderthread machen können.
Ich persönlich denke, dass du die Daten im Thread laden solltest und diese dann lediglich im OpenGL Thread hochladen solltest. Und dann zu einem kontrollierten Zeitpunkt. Dann würde ich auch immer nur eine Textur hochladen und dann eine kleine Pause (500ms) einlegen oder so. Wenn das immer noch zu Problemen führt würde ich es wie bei Half-Life 1 machen. Einfach einen Hinweis einblenden und weiter laden. Wenn es ein wenig ruckelt ist das ja gerade noch so verkraftbar.
Evtl würde es ja genügen, wenn du dein Texturformat überdenkst. Also das Format in dem du deine Texturen ablegt. Mitunter dauert das zwischen und 2-30 ms. Also ein 512x512 Textur. RGB ist bei 30ms anzusiedeln wärend RGBA und Komprimierte bei 2 anzusiedeln sind. Das aber auf einer ATI. Bei NVidia kann ich das nicht beurteilen. Aber wie Finalspace mal gesagt hatte macht das wohl keinen Unterschied. Aber da kann ich zu den Zeiten nichts sagen.
Ergebnis:
Kritischer Fehler
170<-laut Websuche: ERROR_BUSY='Die angeforderte Ressource wird bereits verwendet.'
Also ein Fehler in meinem Code?
Desweitern bräuchte ich eine plattformunabhängige Lösung wenn es möglich wäre.
Lossy eX hat geschrieben:
Vor allem auch, wenn du es synchronisieren würdest würde der Renderthread ja stehen. Und so hättest du es auch gleich im Renderthread machen können.
Unter diesem Punkt hast du Recht, hatte ich nicht bedacht.
Lossy eX hat geschrieben:
Dann würde ich auch immer nur eine Textur hochladen und dann eine kleine Pause (500ms) einlegen oder so.
Vermutlich die Lösung.
Lossy eX hat geschrieben:
Evtl würde es ja genügen, wenn du dein Texturformat überdenkst. Also das Format in dem du deine Texturen ablegt. Mitunter dauert das zwischen und 2-30 ms. Also ein 512x512 Textur. RGB ist bei 30ms anzusiedeln wärend RGBA und Komprimierte bei 2 anzusiedeln sind.
Aktuell ist es als RGB in einer Surface gespeichert. Werde es mit RGBA mal testen.
Komprimiert meinst du die Daten im Speicher? Da SDL diese Komprimierung nicht unterstützt, kann es mein Lader noch nicht.
Könntest du mir aber einfach ein paar Links zur Komprimierung geben? Dann könnte ich die Daten selber im Speicher komprimieren.
Auch wären die passenden Parameter für die Texturerstellung in OpenGL hilfreich, da ich aktuell nur die Methode kenne, wo mir OpenGL die Daten komprimiert, was beim Erstellen langsamer ist.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ne. Ich meine direkte komprimierte Texturen. Also du öffnest die Datei und sendest das so direkt an OpenGL. (bis auf den Header) Mars hatte da mal einen Loader für DDS geschrieben. Müsste hier als Anhang noch irgendwo im Forum existieren. Ein Gimp Plugin findest du hier.
Das einzge was du evtl. machen müsstest wäre die Texturen zu Dekomprimieren, falls keine komprimierten Texturen unterstützt werden. Allerdings ist dieser Fall recht selten. Vor allem da du es für eine neuere Engine verwenden willst. Denke ich mal.
Die Texturen sind dann allerdings nur noch 16 Bit. Was aber bei normalen Bildern normal noch recht gut aussieht. Bei weichen überläufen solltest du lieber RGB in Kauf nehmen. Nen leeren Alphakanal halte ich persönlich für die schlechteste Alternative.
Achja. Ganz wichtig. Verwende unter keinen Umständen die Glu zum Uploaden der Bilddaten. Benutze lieber glTextImage und automatische MipMap Generation. Das ist immer noch tausend mal schneller als die Glu.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.