Kore & Texture Streaming

simon.r
Mausschubser
Mausschubser
Beiträge: 59
Registriert: 4. Okt 2010 16:13

Kore & Texture Streaming

Beitrag von simon.r » 18. Jan 2015 16:49

Hallo,
wir haben bereits eine einfache Variante für das Streaming der Texturen implementiert, mussten aber leider feststellen, dass diese nicht unter allen Konfigurationen funktioniert: Bei mir läuft es nur unter DirectX im Release-Mode, im Debug-Mode bleibt das Fenster irgendwann hängen. Unter OpenGL kriege ich sogar nur ein weißes Bild. Ein anderes Teammitglied bekommt unter OpenGL schwarze Boxen und unter DirectX einen Fehler im Nvidia Treiber.
Möglicherweise liegt das Problem daran, dass parallel zu den Grafik-API Zugriffen beim Rendering auch beim Aufruf des Texture-Konstruktors auf diese Zugegriffen wird und anscheint weder DirectX9 noch OpenGL standardmässig mit Zugriffen von anderen Threads zurechtkommen (http://stackoverflow.com/questions/2534 ... ex-buffers und https://www.opengl.org/discussion_board ... ate-thread).

Wenn dies der Fall ist, dann müsste das Laden der Grafik in Kore von der Textur-Erstellung getrennt werden - vlt. durch einen Konstruktor, der breits ein Image als Parameter entgegennimmt.

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 18. Jan 2015 16:57

Die Grafik-Apis sind nicht threadsicher, ja, im Ladethread kann man also nur die Bilddaten in einen Array schaufeln - und den dann im Hauptthread in die Textur stopfen. Aber stimmt, dafür sollte ich Euch die Bildladeroutinen besser zugänglich machen, Moment...

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 18. Jan 2015 17:28

War ja doch schon zugänglich. Habe nun einfach den Kommentar im Code mit einer kleinen Erklärung dazu erweitert.

philipp_m
Mausschubser
Mausschubser
Beiträge: 99
Registriert: 4. Dez 2010 18:10

Re: Kore & Texture Streaming

Beitrag von philipp_m » 21. Jan 2015 19:41

Dumme Frage aber irgendwie stehe ich gerade auf dem Schlauch: Wie bekomme ich die Bilddaten fehlerfrei aus einem Image- in ein Texture-Objekt? Das scheint ja gewünscht zu sein, aber ich sehe keine Funktion und auch keinen Constructor, die das ermöglichen, und das direkte Kopieren von data, height, width, etc. führt zu weiteren Problemen.

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 21. Jan 2015 19:48

texture.lock() gibt den Zielarray zurück, in diesen jeden Pixel von image.data rüberkopieren. Image-Pixel sind RGBA, Texture.lock-Pixel sind BGRA. Für die Indizes in den Texture-Array Texture.stride (die Länge einer Zeile in Bytes) nutzen.

richard.m
Neuling
Neuling
Beiträge: 7
Registriert: 21. Jan 2015 20:28

Re: Kore & Texture Streaming

Beitrag von richard.m » 21. Jan 2015 20:39

Ich habe die Funktion aus TextureImpl kopiert und angepasst.
Wenn ich sie laufen lasse gibt es aber einen error "Access violation writing location" bei der ersten Textur, bei genau Pixel x=480 y=465.
Wie kann man die Größe des Zielarrays ändern?

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 21. Jan 2015 20:43

Die Textur(en) muss man vorab in der gewünschten Größe anlegen. Die Größe bereits angelegter Texturen zu ändern, das kann weder Direct3D noch OpenGL.

philipp_m
Mausschubser
Mausschubser
Beiträge: 99
Registriert: 4. Dez 2010 18:10

Re: Kore & Texture Streaming

Beitrag von philipp_m » 21. Jan 2015 21:07

Bei mir (Projektgruppe PhilippMueller) funktioniert das Ganze nun prinzipiell, schmiert jedoch nach wenigen Sekunden mit der Nachricht "Texture creation failed." ab. Nun habe ich eine Neuberechnung der Images im zweiten Thread nur bei Änderung der Kameraposition eingführt und das Ganze schmiert nach wenigen Sekunden genauso ab, diesmal jedoch mit einer bad_alloc Exception. Der vorgeschlagene Weg, in dem zweiten Thread jeweils neue Images zu erstellen und im primären Thread jeweils neue Textures zu erstellen, scheinen mir dabei das Problem zu sein.

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 21. Jan 2015 21:09

Klingt als legt Ihr immer neue Texturen/Images an ohne die alten zu löschen? bad_alloc heißt Speicher alle.

philipp_m
Mausschubser
Mausschubser
Beiträge: 99
Registriert: 4. Dez 2010 18:10

Re: Kore & Texture Streaming

Beitrag von philipp_m » 21. Jan 2015 23:05

Danke für die Hilfe, hatte mir das zuvor auch schon gedacht, dass es daran liegen müsste, aber das deleten der Texture/Image-Objekte hatte zu einigen Problemen geführt. Ohne Mutex gab es wie erwartet Fehler, mit Mutex (sowohl generischem Mutex als auch einem Mutex pro Cube) ist die Framerate zusammen gebrochen. Habe jetzt noch einige Optimierungen eingebaut und interessanterweise funktioniert das nun mit einem Pseudo-Mutex (Bool Variable und einige Code-Änderungen zum Verhindern von Problemen) nach einer kurzen Wartezeit beim Starten problemlos, d.h. mit einer hohen FPS und den erwarteten Texturwechseln. Ich hoffe, eine solche Lösung ist akzeptabel, auch wenn sie etwas unschön ist.

richard.m
Neuling
Neuling
Beiträge: 7
Registriert: 21. Jan 2015 20:28

Re: Kore & Texture Streaming

Beitrag von richard.m » 21. Jan 2015 23:37

Kann mir jemand sagen wie dieser Mutex funktioniert?
Mein thread kann sehr oft streamMutex.Lock(); überschreiten ohne ein einziges mal streamMutex.Unlock(); zu betreten (und ein anderer Thread kann in der Zeit auch andere Dinge machen, also z.B. läuft update() obwol stream gerade im Mutex ist).
Zudem schmiert das Programm sofort nach dem Start ohne Fehlermeldung ab (Exitcode 1) wenn ich probiere aus meinem Image Array in stream etwas zu deleten. (Ich benutze ein Image array um die geladenen Images update() zu übergeben)
Und ist es okay wenn das Programm nur inm release modus gut läuft?

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 22. Jan 2015 00:06

Nur im Release-Modus performant und/oder verrückte bool-Tricks - alles ok.
Aber das mit dem Mutex klingt nicht korrekt, auf welchem System verhält sich das so?

dead-flunky
Erstie
Erstie
Beiträge: 12
Registriert: 3. Nov 2009 14:29

Re: Kore & Texture Streaming

Beitrag von dead-flunky » 22. Jan 2015 01:35

Wenn ich das richtig verstehe, wartet die for(;;) immer so lang, bis der streamMutex neu gelocked werden kann. Korrekt?

Ein Image* hab ich auch, aber da lösche ich bisher nichts. Wie ginge das denn korrekt? Einfach images[xy]->~Image();? Ohne streamMutex.Lock() um den Zugriff bekomm ich da einen Speicherzugriffsfehler, mit dem Lock ist es nicht mehr performant.
Zuletzt geändert von dead-flunky am 22. Jan 2015 01:38, insgesamt 1-mal geändert.

RobDangerous
Computerversteher
Computerversteher
Beiträge: 363
Registriert: 14. Okt 2014 17:05

Re: Kore & Texture Streaming

Beitrag von RobDangerous » 22. Jan 2015 01:38

Zum streamMutex-locken - ja. Im Hauptthread muss man dann auch entsprechend locken und dann funktioniert das alles.
Löschen geht mit delete. Also in dem Fall delete images[xy]. Das ruft dann implizit auch ~Image auf.

dead-flunky
Erstie
Erstie
Beiträge: 12
Registriert: 3. Nov 2009 14:29

Re: Kore & Texture Streaming

Beitrag von dead-flunky » 22. Jan 2015 01:42

Ich versuche, nur geänderte Texturen im images zu ändern. Also nicht das ganze Ding wegzuschmeißen. Wenn ich das Lock nur um die tatsächlichen Zugriffe auf images setze, gibt's auch ne Zugriffsverletzung, als wär garkein Lock da.

Antworten

Zurück zu „Archiv“