So vermeiden Sie ein kurzes Ausdehnen der Autorotation von iOS OpenGL ES-Apps

8

Das hat mich in letzter Zeit gestört. Es ist ganz einfach, eine OpenGL ES-App zusammenzustellen, die sowohl Hoch- als auch Querformat unterstützt. Aber während der Autorotation scheint das System den Render-Puffer nur zwangsweise auf die neuen Dimensionen zu dehnen, automatisch zu rotieren und dann das übliche -layoutSubviews - & gt; -resizeFromLayer: usw., so dass die Zeichnungsobjekte an die neuen Darstellungsfeldabmessungen angepasst werden können.

Die meisten Apps, die ich je gesehen habe und die sowohl Portrait als auch Landschaft unterstützen, scheinen sich mit diesem einfachen Ansatz zufrieden zu geben. Aber ich frage mich, ob ich es besser kann ...

Vielleicht sollte ich die Autorotation abfangen, bevor es passiert (mit UIViewController 's üblichen Methoden), "expand" einmal den Render-Puffer zu einem perfekten Quadrat der längsten Bildschirmgröße (zB 1136px x 1136px auf einem iPhone 5) - damit es außerhalb des Bildschirms "blutet", die Autorotation durchführt (keine Änderung der Größe des Renderpuffers und somit keine Streckung, genau wie beim Wechsel zwischen z. B. zwei Querausrichtungen) und schließlich den Framebuffer erneut anpassen, um die unsichtbaren "verschwendeten" Ränder zu entfernen aus dem Bildschirm? (natürlich könnte ich einen quadratischen Framebuffer die ganze Zeit haben, aber das wäre ineffizient fillrate-weise)

Irgendwelche Vorschläge? Gibt es einen besseren Weg, um das zu erreichen, woran ich nicht gedacht habe?

BEARBEITEN

Ich habe meinen Code -resizeFromLayer: folgendermaßen geändert:

%Vor%

... Und es funktioniert! So wie es jetzt aussieht, habe ich die ganze Zeit einen verschwenderischen, aus dem Bildschirm blutenden, quadratischen Renderpuffer, aber das ist nur ein Beweis für das Konzept. Im Produktionscode würde ich die Größenanpassung direkt vor der Autorotation durchführen und die Größe später auf die Bildschirmdimensionen ändern.

    
Nicolas Miari 09.09.2013, 03:04
quelle

1 Antwort

5

Ich habe es recht einfach in meiner 3D-App behoben, indem ich die Ansichtsgröße aus der GLKView presentationLayer abgerufen habe. Dies ergibt die aktuelle Ansichtsgröße während der Rotationsanimation, und die korrekte Projektionsmatrix kann basierend auf dieser Größe während des Aktualisierungsschritts berechnet werden. Dies verhindert Verzerrungen im Seitenverhältnis.

Wenn Sie das ausprobieren möchten, können Sie der OpenGL Game Vorlage in Xcode folgende Zeilen hinzufügen:

%Vor%     
Tark 11.09.2013, 13:05
quelle