Animieren von Ansichten mit Core-Animationsebene

8

Ich habe ein NSWindow , das ein NSView enthält, mit 'Wants Core Animation Layer' aktiviert. Die Ansicht enthält dann viele NSImageView , die anfänglich in Position animiert werden. Wenn ich die Animation starte, ist sie extrem träge und lässt die meisten Frames fallen. Wenn ich jedoch 'Wants Core Animation Layer' deaktiviere, funktioniert die Animation perfekt. Ich werde die Kernanimationsschicht benötigen, aber ich kann nicht herausfinden, wie ich sie richtig ausführen kann.

Kann ich etwas tun, um die Leistungsprobleme zu beheben?

Hier ist der Code:

%Vor%     
Kevin Sylvestre 25.01.2011, 01:02
quelle

2 Antworten

10

Es ist möglich, dass NSTimer deine Leistung zerstört. Core Animation bietet umfangreiche Unterstützung für die Steuerung des Timings von Animationen über das CAMediaTiming -Protokoll. Dies sollten Sie in Ihrer App nutzen. Versuchen Sie nicht, den Animator-Proxy und NSAnimationContext zu verwenden, sondern Core Animation direkt zu verwenden. Wenn Sie für jedes Bild ein CABasicAnimation erstellen und dessen beginTime festlegen, wird der Start der Animation verzögert. Damit die Verzögerung so funktioniert, wie Sie möchten, müssen Sie jede Animation in eine CAAnimationGroup mit ihrer duration -Einstellung für die gesamte Zeit der gesamten Animation einbinden.

Die Verwendung der Eigenschaft frame könnte ebenfalls zur Verlangsamung beitragen. Ich nutze die transform -Eigenschaft in CALayer gerne in solchen Situationen, in denen du eine "öffnende" Animation machst. Sie können Ihre Bilder in IB (oder in Code) an ihren endgültigen Positionen platzieren, und bevor das Fenster sichtbar wird, ändern Sie ihre Transformationen in die Startposition der Animation. Dann setzen Sie einfach alle Transformationen auf CATransform3DIdentity zurück, um die Schnittstelle in ihren normalen Zustand zu versetzen.

Ich habe ein Beispiel in meinem & lt; plug type="schamlosen" & gt; bevorstehenden Core-Animationsbuch & lt; / plug & gt; , das dem, was du bist, sehr ähnlich ist versuchen zu tun. Es animiert 30 NSImageView s gleichzeitig ohne verlorene Frames. Ich habe das Beispiel für Sie geändert und es auf github gestellt. Dies sind die wichtigsten Bits des Codes mit dem überflüssigen UI-Material:

Transformiere die Ebenen in ihre Startposition

%Vor%

Animiere die Transformation zurück zur Identität

%Vor%

Ich habe auch ein Video auf YouTube des Beispiels in Aktion, wenn du es ausprobieren möchtest.

    
Nathan Eror 06.02.2011, 20:56
quelle
1

Haben Sie versucht, alles in einer CAT-Transaktion zu stapeln?

%Vor%
  

CATransaction ist der Core-Animationsmechanismus zum Batching mehrerer Ebenenbaumoperationen in atomare Aktualisierungen der Rendering-Struktur.

    
Fabio 28.01.2011 00:59
quelle