Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 04:00

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL im Thread
BeitragVerfasst: Fr Okt 21, 2005 14:08 
Offline
Ernährungsberater
Benutzeravatar

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 :(

Wenn jemand Ideen hat, dann her damit.

Danke


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 21, 2005 14:13 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Der aktuelle RC ist immer nur für den jeweiligen Thread gültig. Man muß daher in jedem Thread wglMakeCurrent aufrufen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 21, 2005 14:39 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 21, 2005 14:52 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Code:
  1. //im Mainteil:
  2.   DC:=wglGetCurrentDC;
  3.   if DC=0 then writeln('DC-Fehler');
  4.   RC:=wglGetCurrentContext;
  5.   if RC=0 then writeln('RC-Fehler');
  6.  
  7. //im Thread:
  8.   if not wglMakeCurrent(DC,RC) then writeln('Kritischer Fehler');
  9.   Writeln(GetLastError);

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.

Nochmal Danke für eure schnellen Antworten.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 21, 2005 16:07 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]