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

Aktuelle Zeit: Fr Jul 18, 2025 12:29

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Sep 20, 2007 12:00 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Ich habe eine Applikation die in mehreren Threads einige Hundert Display Listen erstellt, welche dann von einem Render-Thread gerendert werden. Vor dem Erstellen der Display Listen und vor dem Rendern share ich natürlich die Rendering Contexts mit wglShareLists.

Nun beobachte ich ein sonderbares Verhalten der Listen: einige (nicht alle) der Listen werden nicht gerendert, es sei denn man ruft direkt nach dem Erstellen jeder Liste nach glEndList() den Befehl glIsList() auf. Dann werden komischerweise alle Listen gerendert. Kann mir vielleicht jemand dieses Verhalten erklären?

Danke im Voraus!

Grüße,
Mike


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Mehrere Threads? Ich hoffe jeder Thread hat seinen ganz persönlichen Kontext? Denn wenn nicht wundert es mich warum du überhaupt etwas siehst. OpenGL ist an einen Thread gebunden.

Wenn das der Fall sein sollte dann weiß ich so nicht warum die teilweise nicht gehen. Ich vermute aber starkt, dass es damit zusammenhängt. Ich muss auch gestehen, dass ich nicht weiß wie die Sachen geshared sind. Evtl gibt es dort vielleicht auch timingproblem was durch glIsList behoben wird.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 13:01 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Ja natürlich hat jeder Thread einen eigenen Context, sonst würde es gar nicht funktionieren, wie Du schon selbst sagst. Die Contexte werden mit wglShareLists geshared, bevor es zum Erstellen der Display Listen und zum Rendern kommt.

An Timingprobleme habe ich auch schon gedacht, allerdings habe ich nicht rausfinden können was das für Probleme sind. Das Hinzufügen und das Rendern der erstellten Display Listen in Datencontainer ist durch Critical Sections geschützt (ich programmiere mit C++).

Ein anderer Gedanke den ich hatte war die Möglichkeit dass einige Listen aus verschiedenen Threads gleiche IDs erhalten und daher sich gegenseitig überschreiben. Zum Test habe ich dann in jedem Thread ein weit genug voneinander entferntes Base mit glListBase gesetzt, das hat aber auch nichts gebracht :(.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 13:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wollte auch nur auf Nummer Sicher gehen. ;)

Ich muss aber gestehen, dass ich da in diesem Falle auch nur raten kann, denn davon höre ich auch das erste mal. Aber mal etwas anderes. Was packst du eigentlich in die DisplayListen? Bzw was versucht du generell damit? Evtl wäre ein anderes Design sogar empfehlenswerter. Denn so wie ich das sehe gibt es 2 wahrscheinliche Szenarien für das Problem. Entweder ist es ein Problem in deinem Treiber und auf anderen System passiert so etwas nicht und alles funktioniert. Was du in jedem Falle mal probieren solltest. Also deine Software auf anderen Systemen. Oder aber es liegt daran, dass du mehere Threads hast und viele DisplayListen erstellst. Dann könnte es sogar sein, dass du auf anderen Systemen noch mehr Probleme bekommst. Denn die "Lösung" über glIsList kommt mir persönlich nicht ganz geheuer vor. Nur so eine innere Stimme die das zu mir sagt. Aber die innere Stimme ist manchmal ganz schön vorlaut. ;)

Wenn du nur Vertexdaten dort hast wären evtl auch VBOs nicht uninteressant. Wobei ich nicht weiß ob du die aus meheren Threads erstellen kannst. Aber da wäre es noch möglich kurzeitig den Hauptthread zu unterbrechen und anstehende VBOs eben hochzuladen. Dadurch, dass die Daten dann schon alle fertig wären würde es auch nicht mal ansatzweise so lange dauer wie bei einer DisplayListe. Erschwerend kommt noch hinzu, dass DisplayListen auf langer Sicht sowieso aussterben werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 14:09 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Lossy eX hat geschrieben:
Wollte auch nur auf Nummer Sicher gehen. ;)
Ich muss aber gestehen, dass ich da in diesem Falle auch nur raten kann, denn davon höre ich auch das erste mal. Aber mal etwas anderes. Was packst du eigentlich in die DisplayListen? Bzw was versucht du generell damit? Evtl wäre ein anderes Design sogar empfehlenswerter. Denn so wie ich das sehe gibt es 2 wahrscheinliche Szenarien für das Problem. Entweder ist es ein Problem in deinem Treiber und auf anderen System passiert so etwas nicht und alles funktioniert. Was du in jedem Falle mal probieren solltest. Also deine Software auf anderen Systemen. Oder aber es liegt daran, dass du mehere Threads hast und viele DisplayListen erstellst. Dann könnte es sogar sein, dass du auf anderen Systemen noch mehr Probleme bekommst.

Meine Display Listen enthalten statische Vertexdaten und Texturen. Ich rendere eine Erde mit Höhendaten und Texturen usw. Da ich das Rendern und das Laden neuer Daten entkoppeln muss (a la Google Earth), bin ich an die Lösung mit mehreren Threads gebunden. Werde später meine Software an anderen Systemen ausprobieren (müssen), habe aber im Moment nicht die Möglichkeit dazu. Aber ich glaube dass die Wahrscheinlichkeit, dass das Problem an meinem Graka-Treiber liegt, eher gering ist.

Lossy eX hat geschrieben:
Denn die "Lösung" über glIsList kommt mir persönlich nicht ganz geheuer vor. Nur so eine innere Stimme die das zu mir sagt. Aber die innere Stimme ist manchmal ganz schön vorlaut. ;)

Meine innere Stimme sagt genau das gleiche, daher auch meine Frage hier im Forum :-). Ich mag generell keine "Lösungen", wo ich nicht verstehe wieso sie funktionieren.

Lossy eX hat geschrieben:
Wenn du nur Vertexdaten dort hast wären evtl auch VBOs nicht uninteressant. Wobei ich nicht weiß ob du die aus meheren Threads erstellen kannst. Aber da wäre es noch möglich kurzeitig den Hauptthread zu unterbrechen und anstehende VBOs eben hochzuladen. Dadurch, dass die Daten dann schon alle fertig wären würde es auch nicht mal ansatzweise so lange dauer wie bei einer DisplayListe. Erschwerend kommt noch hinzu, dass DisplayListen auf langer Sicht sowieso aussterben werden.

Zu den VBOs kann ich auch nicht viel sagen, habe nur ansatzweise damit gearbeitet. Vielleicht werd ich später mal auf sie umsteigen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 15:26 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hast du da rein zufällig ein MultiCore / HT System? Könnte mir evtl auch vorstellen, dass so etwas auch Probleme mit sich bringen kann. Bzw weiß ich nicht ab wie vielen RCs die Treiber Probleme machen können. Will ich auch nicht ausschließen. Evtl kannst auch mal die Anzahl der gleichzeitig existierenden Kontexte etwas beschränken.

Ich weiß ja nicht um wie viele Daten es sich handelt aber vielleicht würde es auch schon ausreichen, wenn du das Laden etwas aufteilst. Also in dem du einen klaren Unterschied zwischen "Daten laden" und "Daten an OpenGL übergeben" machst. Denn aus eigenen Erfahrungen weiß ich, dass eine Textur innerhalb von 1-2 ms (je nach eingestellten Parameter) generiert wird wärend hingegen das Laden von Festplatte bzw. das Dekomprimieren der Formate bis zu 100-200ms dauern kann. Wenn die Daten aus dem Netz kommen dauert es um ein vielfaches länger. Und wenn die Daten komplett geladen wurden übergibst du sie zu einem festgelegten Zeitpunkt stumpf an OpenGL. Das würde synchron aus deinem RenderThread passieren. Und nicht zu viel auf einmal. Bei Texturen sollte das kein Thema sein. Bei den DisplayListen könnte das evtl etwas länger dauern. Zu mal ich nicht weiß wie genau die aussehen. Mit VBOs könntest du die wieder ziemlich direkt übergeben. So würdest du nur noch einen Kontext benötigen und das Laden der Daten wäre trotzdem noch vom Rendern losgelöst. Und je nachdem was deine Anwendung macht dürfte der Benutzer nicht mal was merken weil das ja so oder so irgendwo gemacht werden müsste. Und die anderen Thread benötigen irgendwo auch etwas Zeit/Leistung.

Ach ja. Herzlich willkommen im Forum. :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Sep 20, 2007 20:52 
Offline
DGL Member

Registriert: Mi Sep 19, 2007 11:02
Beiträge: 12
Ja stimmt ich arbeite mit einem Core Duo, könnte ja sein dass es auch daran liegt

Ich trenne bereits jetzt schon das Laden von Festplatte/Internet, die Erstellung der Display Listen und das Rendern selbst. Das heisst zwischen den glNewList- und den glEndList-Aufrufen erfolgen nur ganz wenige unkritische mathematische Berechnungen. Werde wohl in nächster Zeit VBOs versuchen, vielleicht kann ich damit das Problem beheben (noch funktioniert ja die glIsList-"Lösung").

Danke für den netten Empfang im Forum!

:)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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 ]