Hallo Leute! Ich hab im Moment ein Problem, das ich nur sehr schlecht beschreiben kann, ich versuche es mal trotzdem. Ich gehe gerade den Code mit Einzelschrittabarbeitung durch, um einen Fehler zu finden. Der Code, der läuft, läuft in einem eigenen Thread (Multithreading) und kümmert sich darum, dass eine Displayliste kompiliert wird. Dann wird glVertexPointer() aufgerufen und auf einmal funktioniert die Einzelschrittabarbeitung nicht mehr. Der Zeilencursor geht nach dem Aufruf von glVertexPointer() ohne ersichtlichen Grund ans Ende der Prozedur.
Habt ihr vielleicht irgend eine Ahnung? Braucht ihr mehr Daten?
Ich benutzte übrigens Delphi 5 Prof.
Die Prozedur AddGroup und auch CompileGroup werden vom zweiten Thread aufgerufen. Während der zweite Thread die Listen kompiliert, rendert der VCL-Thread andere Listen - sie dürften sich also eigentlich nicht in die Quere kommen. Die einzigen Bereiche, in denen sie sich überschneiden sind Bereiche, in denen beide nur lesen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ahm, die OpenGL-Kontexte sind Threadgebunden. Das heißt, du kannst vom zweiten Thread nicht ohne weiteres auf den OpenGL-Kontext deines Hauptthreads zugreifen. Geht nicht.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Oh mann... das wäre sehr ärgerlich ;) Ich möchte doch nur Displaylisten kompilieren. Kann ich die nicht irgendwie
"mitnehmen"? Oder muss ich wohl oder übel die Struktur fürs Multithreading ändern?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Soweit ich weiss, musst du die Displaylisten im Hauptthread kompilieren. Eine Alternative wäre ein Workaround mit ShareLists, oder wie der Befehl heißt, aber das ist glaube ich keine so gute idee. Du brauchst dafür nen zweiten Kontext und dementsprechend auch einen in diesem Thread erzeugten DeviceContext (HDC). Und ich bin mir jetzt nicht sicher, ob sich dieser ShareLists-Befehl überhaupt auf Displaylisten auswirkt.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Es ist möglich displaylisten genauso wie texturen zwischen versachiedenen kontexten zu sharen. Jedoch ist auch das nicht unproblematisch. (z.B. Plattformabhängigkeit)
Deutlich besser wäre es auf Vertex Buffer Objects zu setzten, hier kann man in einem zweiten Thread die daten vorbereiten und mit wenigen befehlen auf die Grafikkarte hochladen.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Doch Doch. Das braucht man auch. oc2k1 meinte ja nur das Vorbereiten der Daten. Also eigentlich nichts weiter als einen Buffer im RAM der innerhalb eines Threads gefüllt wird. Dieser kann dann im Renderloop recht einfach mit glBufferData oder glBufferSubData in einem Stück übergeben werden. Dann würde der Thread genau genommen gar kein OpenGL machen.
afaik geht es auch wenn man den buffer im hauptthread mapped, dann den pointer an den nebenthread übegibt und ihn dort füllt, und anschließend wieder im Huptthread unmapped. Ist nur hässlich zu programmieren.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Technisch gesehen sollte das auch funktionieren. Aber der Buffer ist dann für diesen Zeitraum gelockt. Und wenn man das VBO zwischenzeitlich zum Rendern benutzen will, dann wird man einen OpenGL Fehler bekommen. Da bleibt dann nichts Anderes übrig als selber so lange zu warten sonst gibts kaputte Frames. Der Vorteil von Threads wäre dann ziemlich gering. Bei der anderen Methode wäre es nicht so schlimm, wenn das Generieren auch mal nen Momemt länger dauern würde. Das VBO bleibt ja weiterhin vollkommen funktionstüchtig.
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.