2010-07-22 7 views
3

J'ai une boucle qui déclenche une fonction 30 fois par seconde. La fonction change la position d'un couple de points que j'utilise pour animer. Je dessine des lignes à travers tous les points, ce qui signifie que les lignes vont changer 30 fois par seconde.Optimiser le dessin animé de Core Graphics (iPhone)

Je dessine ces lignes à un CGLayer, qui est ensuite dessiné à un UIView dans la méthode drawRect:. Je fais cela parce que je comprends que les performances sont améliorées en tirant hors écran. Cependant, il semble que le CGLayer enregistre toutes les lignes réelles au lieu de pixels dessinés, puisque même si je l'efface, le programme s'exécute de plus en plus lentement au fil du temps lorsque plus de lignes sont dessinées.

Je demande d'autres façons d'animer cela. Quel est le moyen le plus efficace et pourquoi?

Répondre

4

Vous devez utiliser l'infrastructure Core Animation pour animer les propriétés sur la couche. Vous pouvez soit sous-classer CALayer ou utiliser un délégué pour faire le dessin réel. Dans le code de dessin, vous pouvez accéder à la propriété interpolée et l'utiliser pour déplacer des points, modifier l'épaisseur des lignes ou tout autre élément que Core Graphics vous permet de contrôler. Regardez this example code from Apple et voyez comment il utilise la valeur lineWidth en cours d'animation.

This little tutorial by John Blackburn est l'une de mes introductions préférées à Core Animation. Il y a quelques concepts différents à saisir, mais en général, il est assez simple de créer des animations assez complexes.

Votre problème avec les choses qui tournent plus lentement et plus lentement n'a probablement rien à voir avec Core Graphics. Il se pourrait que vous créiez accidentellement de plus en plus de temporisateurs par exemple.

+0

Merci! Le problème avec les choses qui tournaient plus lentement était que je dessinais dans un contexte qui n'était pas un bitmap, mais sauvegardais toutes les lignes comme des lignes réelles, ce qui faisait des anciennes lignes qui ne montraient pas de dessin. Cependant dessiner à un contexte de bitmap l'a fait fonctionner. Je vais vérifier les tutoriels que vous avez envoyés, merci! :) – Accatyyc

4

Si vous avez un chemin qui doit être animé d'un état à l'autre, je vous recommande vivement de regarder CAShapeLayer. Ce type de couche vous permet de spécifier deux chemins (avec le même nombre de points de contrôle) et de les animer facilement en utilisant Core Animation.

Deux bons articles sur le sujet sont "Marching Ants With Core Animation" par Matt Long et "Complex Interpolation with CAShapeLayer (Free)" par Joe Ricioppo. Si vous avez à la place des parties de l'image qui restent les mêmes et que vous avez juste besoin de nouveaux éléments composites, je vous recommande de dessiner des parties de l'image dans CALayers ou UIViews statiques, puis d'ajouter de nouvelles vues sur En haut de cela pour les pièces qui changent. La composition de couches est beaucoup plus rapide que de redessiner le contenu d'une vue ou d'un calque.

+0

Merci! Il est temps d'apprendre à composer. – Accatyyc

Questions connexes