Kombinieren von UIView-Animationsblöcken und OpenGL ES-Rendering

8

Ich entwickle ein iP * Spiel und ich benutze sowohl UIKit als auch OpenGL ES 2.0. Die UIKit-Elemente werden über die OpenGL-Ansicht gerendert und belegen einen beträchtlichen (beliebigen) Bildschirmbereich. Ich muss zugeben, dass Apple eine hervorragende Arbeit geleistet hat und die Framerate des Spiels immer 60 FPS beträgt.

Um zu dieser Schlussfolgerung zu kommen, habe ich viele Tests bezüglich der Leistung durchgeführt:

  1. Ich habe viele statische (nicht bewegte) UIViews über die OpenGL-Ansicht hinzugefügt - OK!
  2. Ich habe mit benutzerdefiniertem Code die gleichen UIViews animiert (die center-Eigenschaft in der drawFrame-Methode meines Spiels geändert) - OK!.
  3. Ich habe viele OpenGL ES Elemente unter den UIViews hinzugefügt - OK!
  4. Ich habe viele bewegliche OpenGL ES-Elemente unter den UIViews hinzugefügt - OK!

Nun möchte ich das Core Animation Framework nutzen, um die UIKit-Elemente zu animieren. Ich benutze

%Vor%

in oder um die Animationen auszuführen (ich ziele auf iOS 4 oder neuer).

Das Problem ist jetzt, dass die Bildrate dieses seltsame Verhalten hat: Manchmal bekomme ich 60 fps mit viele UIKit animierenden Elementen (30 Elemente sind OK für mich) und ein paar mal ist die Bildrate offensichtlich unter 60 fps, selbst mit einem single animierenden UIKit-Element, aber ich kann es nicht mit Instrumenten messen! Lassen Sie mich mehr erklären: Wenn ich Instrumente öffne und die Kernanimation und / oder den OpenGL-Treiber beobachte, bekomme ich immer 60 fps. Aber ist es offensichtlich, dass dies nicht der Fall ist, ich kann mit meinen Augen sehen, dass sich die OpenGL-Animationen viel langsamer bewegen als die entsprechenden UIKit-Animationen auf der Oberseite. Wenn ich die UIKit-Elemente aus der Ansicht entferne, wird die Bildrate wieder normal. Eine ähnliche Situation wie die, die ich hier beschreibe, passiert in jedem OpenGL ES-Spiel, wenn der Benutzer die Lautstärke des Geräts während des Spiels ändert. Wenn die transparente Ansicht, die die aktuelle Lautstärke anzeigt, anfängt auszufallen und bis sie vollständig verschwindet, fällt die Bildrate drastisch ab, aber in den Instrumenten (ich habe diesen Test auch gemacht) klemmt sie auf 60 fps!

Also, um es zusammenzufassen: Manchmal bekomme ich echte 60 fps mit Blockanimationen ohne Höhen und Tiefen für einen Lauf und manchmal bekomme ich falsche 60 fps ohne Höhen und Tiefen.

Haben Sie eine Lösung? Alle Tests wurden auf einem iPad 2 und iPhone 3GS mit iOS 5.1 durchgeführt

    
Summon 12.04.2012, 09:31
quelle

1 Antwort

9

Ich habe es geschafft, das Problem zu lösen und jetzt kann ich UIView block / core-basierte Animationen in meinem OpenGL-Spiel ohne Leistungsabfall kombinieren.

Die Lösung ist ziemlich einfach:

  1. Behalten Sie für jede UIView, die Sie in Ihrer OpenGL-Anwendung haben möchten, die Eigenschaften für Grenzen, Zentrieren und Transformieren in Ihrem OpenGL-Bildschirmkoordinatensystem (z. B. die folgenden Eigenschaften: GLBounds, GLCenter, GLTranform) und aktualisieren Sie sie jedes Mal, wenn Sie eines davon ändern die entsprechenden UIView-Eigenschaften.
  2. Wenn du das Spiel startest, lade die UIViews, aber setze sie auf versteckt . UIKit zeichnet also nicht oberhalb der OpenGL-Ansicht (auf diese Weise wird das Frame-Drop-Problem vollständig eliminiert). Zeichnen Sie die UIViews stattdessen mit den GL * -Eigenschaften, die Sie in Schritt 1 erstellt haben, und verwenden Sie die entsprechende Texturen (die Bilder / Farben, die Sie für jede UIView verwendet haben).
  3. Animieren Sie die hidden UIViews-Eigenschaften (Grenzen, Zentrieren und Transformieren) mithilfe von Block- / Kernanimationen, abhängig von der gewünschten Animation (die wiederum Ihre GL * -Eigenschaften aktualisiert) und Ihrer OpenGL-Zeichnung Verwenden Sie die GL * -Eigenschaften, um die UIViews zu zeichnen! Um die tatsächlichen Werte für Grenzen zu erhalten, zu zentrieren und zu transformieren, wenn eine UIView animiert (und die GL * -Eigenschaften aktualisiert), verwenden Sie die presentationLayer-Eigenschaft.

Am besten,

    
Summon 21.04.2012, 13:51
quelle