Ändern der Größe eines GLKView
-
27-10-2019 - |
Frage
Wenn die Größe eines GLKView
s geändert wird, werden einige Operationen hinter den Kulissen für die Puffer und den Kontext dieses GLKView
s ausgeführt. Während der Zeit, die für diese Operationen hinter den Kulissen benötigt wird, führt das Zeichnen auf den GLKView
nicht zu korrekten Ergebnissen.
In meinem Szenario habe ich einen GLKView
, für den setNeedsDisplay
aktiviert ist. Wenn ich den Inhalt auf dem Bildschirm aktualisieren muss, rufe ich einfach -setNeedsDisplay
auf
GLKView
. Ich verwende GLKView
zum Zeichnen von Bildern. Wenn ich also ein Bild mit einer anderen Größe zeichnen muss, muss ich auch die Größe des GLKView
s ändern.
Das Problem: Wenn ich die Größe des GLKView
ändere und setNeedsDisplay
in dieser Ansicht aufrufe, ist das Ergebnis auf dem Bildschirm nicht korrekt. Dies liegt daran, dass der GLKView
nicht ausgeführt wird, um die durch die neue Größenänderung aufgerufenen Operationen hinter den Kulissen abzuschließen, bevor versucht wird, das neue Bild zu zeichnen
Ich habe eine Problemumgehung gefunden, indem ich Folgendes aufgerufen habe: performSelector:@selector(setNeedsDisplay) withObject:nil afterDelay:0
statt nur setNeedsDisplay
auf dem GLKView
. Dies zwingt den Hauptthread grundsätzlich dazu, zu warten, bis alle openGL-Operationen hinter den Kulissen abgeschlossen sind, bevor setNeedsDisplay
aufgerufen wird. Obwohl dies in Ordnung funktioniert, frage ich mich, ob es eine bessere Lösung gibt. Gibt es beispielsweise einen openGL-Aufruf, mit dem der Thread warten soll, bis alle openGL-Vorgänge abgeschlossen sind, bevor er fortfährt?
Lösung
Die Lösung bestand darin, das CIContext
-Objekt zurückzusetzen, nachdem die Größe des GLKView
geändert wurde.
Vielen Dank für nichts, alle!