iOS OpenGL Catch-22: OpenGL-Hintergrundregeln und "App-Snapshot" für App Switcher

8

Wie viele Entwickler habe ich eine App, die OpenGL über eine Unterklasse UIView verwendet, deren Methode layerClass: [CAEAGLLayer class] zurückgibt.

Hinweis Ich bin nicht mit GLKit oder GLKView oder GLKViewController

Wenn ich nach Hause klicken Sie auf die App in den Hintergrund zu stellen, nachdem applicationDidEnterBackground , ruft iOS meine Ansicht des layoutSubviews zweimal, mit Hoch- und Quer Größen versuchen, eine „App Schnappschuss“ zu erzeugen, wie hier erläutert (siehe „Vorbereitung für den App-Snapshot "):

Ссылка

Wie kann das funktionieren?

Es scheint hier einen direkten Widerspruch zu dem sehr deutlichen Hinweis auf dieser Seite zu geben (siehe "Hintergrund-Apps können keine Befehle auf der Grafik-Hardware ausführen"):

Ссылка

dass wir mit OpenGL nach applicationDidEnterBackground

nichts mehr zeichnen dürfen

Wenn wir nicht zeichnen, können wir die Snapshots nicht erzeugen. Wir müssen gegen die eine oder die andere Regel verstoßen.

Aber wir wollen auch gute Schnappschüsse in beiden Orientierungen, so dass die Benutzer, wenn sie einen Doppelklick machen und zum App Switcher gehen, vernünftige Schnappschüsse sehen.

Auch wenn ich meinen Code vorübergehend vollständig ändere das layoutSubviews nach applicationDidEnterBackground zu implementieren, indem eine OpenGL-Oberfläche erstellen und zeichnen (die, im Gegensatz zu dem Apple-Dox, nicht abstürzt) und dann I-Doppelklick auf zu Hause und schau dir den Schnappschuss in verschiedenen Orientierungen an, nur der Schnappschuss für die Orientierung, in der ich vorher war, ist korrekt. Die andere ist eine super-hässliche böse Skalierung des anderen Schnappschusses. Apple scheint die Bewegungen von Schnappschüssen durchzugehen, aber nicht wirklich zu nehmen.

Ich sehe dieses Verhalten auf iOS 9.3.2 auf einem iPad Mini. Das Verhalten wird auf den meisten / allen iPhone-Geräten nicht angezeigt, da sie App-Switcher im Querformat nicht unterstützen.

UPDATE: Das Problem tritt auch auf und passiert noch viel schlimmer, wenn Sie die neue Multitasking-Funktion "Slide Over" von iOS 9 verwenden und dieselbe App zwischen einer normalen Vollbild-App und einer App umschalten rutschte über eine andere App. iOS scheint nur eine Momentaufnahme der letzten App Größe zu erfassen, so dass nach der App auf 640px breit und anschließend versuchen, die App Switcher zu verwenden, um das App Vollbild zu erhalten, sehen wir einen groteske pixely out-of-Anteil Schnappschuss im App Switcher und auch während der ersten Sekunde des Starts. Es muss einen Weg geben, das zu beheben!

UPDATE 2: Ich habe ein paar iOS-Apps gesehen, von denen ich weiß, dass sie OpenGL-Anwendungen sind. Wenn Sie sie im Hochformat verwenden, gehen Sie zurück nach Hause und drehen Sie auf Querformat -Klicke auf Home, du siehst das Portrait-Startbild anstelle eines schrecklichen, verzerrten, unproportionierten Bildes, wie ich es sehe. Während ich Snapshot-Bilder bevorzugen würde, wäre ich sogar glücklich, das Startbild zu sehen. Aber die Option, die von allen erwähnt wird, ignoreSnapshotOnNextApplicationLaunch , funktioniert nicht , da sie nur das betrifft, was Sie beim Start der App sehen, nicht das, was Sie im App Switcher sehen, wenn Sie auf Home doppelklicken Viele von StackOverflow haben sogar überhaupt nicht funktioniert (nicht einmal zur Startzeit).

Wie kommen wir um diese Catch-22 herum?

Dieser StackOverflow-Thread (im Gegensatz zu mir verwendet das OP hier GLKit, aber das Symptom ist dasselbe):

iOS OpenGL ES Bildschirm-Rotation während Hintergrund apps bar sichtbar

bestätigt, dass einige OpenGL-Apps auf iOS in der Lage sind, korrekte Vorschaubilder im Home-Doppelklick-App-Switcher für beide Ausrichtungen zu haben. Wie machen sie das?

Wie kann ich richtige Schnappschüsse in beiden Orientierungen im App Switcher erhalten?

Hier ist ein Protokoll AppDelegate (appdel) ViewController (eaglc) und View (EAGLV) Anrufe, die zu der Zeit von iOS gekommen, dass ich einmal die Home-Taste klicken, um die App zu verlassen. Sie können die Snapshot-Versuche sehen, die nach didEnterBackground kommen:

%Vor%     
Louis Semprini 02.06.2016, 21:04
quelle

0 Antworten