2009-02-27 16 views
2

Je suis conscient du fait que Core Animation distribue ses animations dans un thread séparé, comme indiqué dans la documentation. Néanmoins, mes animations semblent bloquer mon fil principal. Toutes les animations commencent et finissent. (Avec ou sans kCATransactionDisableActions défini comme vrai.) Mais devenez nerveux et les arrêts de piste principaux.Comment empêcher Core Animation de bloquer mon thread principal?

Qu'est-ce que je fais mal?

exemple conceptuel:

[NSTimer scheduledTimerWithTimeInterval:0.0333 target:self selector:@selector(gameEngine) userInfo:nil repeats:YES]; 

- (void)gameEngine 
{  
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
    myLayer.position = CGPointMake(newX, newY); 
    [CATransaction commit];  
} 
+0

Pour l'anecdote: nous plongons dans OpenGL ES. – Kriem

Répondre

7

Créer 30 nouvelles animations par seconde est une très mauvaise idée, et non pas comment Core Animation devait être utilisé. Core Animation a été conçu autour de l'idée que vous indiquiez au système où vous voulez que votre couche (ou vue sauvegardée par couche) se termine, et qu'elle détermine le reste, y compris le nombre d'images à lancer pour exécuter l'animation dans le délai fournir. Les animations elles-mêmes fonctionneront sur un thread d'arrière-plan, mais je crois qu'il y a une petite configuration qui doit être effectuée en premier, qui a lieu sur le thread appelant (généralement le thread principal). Cette configuration peut prendre plus de 1/30ème de seconde, ce qui surchargerait votre thread principal.

Votre but devrait être de minimiser l'interaction avec Core Animation. Si vous disposez d'une trajectoire de mouvement complexe, mais scriptée (ou d'un autre changement de propriété), configurez-la à l'avance à l'aide d'un CAKeyframeAnimation et appelez cette animation une seule fois. S'il y a quelque chose à propos du mouvement de votre objet qui doit être modifié en réponse à l'entrée de l'utilisateur, faites-le seulement quand vous obtenez l'entrée réelle. Si vous modifiez une propriété d'une animation mid CALayer, elle se déplacera doucement du milieu de sa trajectoire de mouvement actuelle vers sa nouvelle destination. Si vous travaillez avec Core Animation de cette manière, vous pouvez animer simultanément jusqu'à 50 couches translucides en mouvement à 60 FPS sur l'iPhone.

1

Étant donné que vous commencez une animation 30 fois par seconde j'imagine que vous terrassant le système. Est-ce que les animations précédentes ont même le temps de commencer avant d'en créer une nouvelle?

+0

Ils le font. Ils commencent tous et finissent. (Avec ou sans kCATransactionDisableActions défini comme vrai.) Malgré cela, Core Animation ne devrait pas bloquer mon runloop principal. – Kriem

+0

Si CA est débordé, votre boucle principale peut en effet bloquer. Les fils ne sont pas des choses magiques avec des ressources infinies. –

Questions connexes