Question

Core Animation utilise un fil d’arrière-plan pour faire son travail. Maintenant, le problème est le suivant: j'ai un calcul lourd en cours dans le fil principal. Core Animation se fige immédiatement jusqu'à ce que le calcul soit effectué. Et puis il continue à finir ses animations. Je me souviens d’avoir lu dans un document que le temps de traitement de CA n’était pas prioritaire, ce qui signifie que tout ce que le fil principal souhaite faire est hautement prioritaire et se fera plus probablement que toute animation sophistiquée en même temps.

Je souhaite forcer Core Animation à planifier son fil d’arrière-plan avec le fil principal en toutes circonstances. Ou encore, un thread distinct qui exécutera le calcul lourd en dehors du thread principal. J'ai déjà essayé cela, mais CA reste bloqué jusqu'à ce que ce soit fait. Je m'attends à ce que le planificateur permute rapidement le temps de traitement entre CA et ce calcul.

Comment CA pourrait-il être contraint de continuer à travailler? Si les choses vont un peu plus lentement que ça, c'est bien. Mais le plus important, c’est que tout continue, du point de vue des utilisateurs.

Était-ce utile?

La solution

N'exécutez pas de calculs lourds sur le thread principal, car ils bloqueraient l'interface utilisateur et entraîneraient une mauvaise expérience utilisateur. Exécutez-les dans un fil d’arrière-plan.

Cela étant dit, l'iPhone est un système monocœur. Par conséquent, si un calcul établit le processeur dans un seul thread, les performances de tous les autres threads risquent de s'arrêter presque. Si vous le pouvez, essayez de diviser votre calcul en éléments plus petits et de les exécuter en tant que NSOperations dans une NSOperationQueue. Si vous vous assurez que les segments de calcul ne sont pas si petits que le temps système nécessaire à la création d'une opération NSO pour eux devient trop volumineux, cela peut permettre de limiter un peu le calcul afin que vos animations ne soient pas ralenties.

Core Animation a tendance à effectuer un certain nombre de calculs au début, avant qu’une animation ne puisse être exécutée, de sorte que ceux-ci peuvent être ralentis par votre fil de calcul lourd. Vous pouvez également être en mesure de démarrer votre calcul lourd dans la méthode -animationDidStart: delegate pour votre CAAnimation, ce qui permet de lancer le calcul uniquement lorsque l'animation est en cours. Je pense que la progression d’une animation utilise moins de calculs que son début, elle peut donc mieux coexister avec vos calculs lourds.

Autres conseils

Vous pouvez utiliser [vidage CATransaction] pour vider l'animation principale si vous ne laissez pas le cycle d'exécution suivre son cours

Je ne suis pas sûr, mais vous pouvez essayer d'appeler [NSThread setThreadPriority: 1.0] si vous exécutez votre autorité de certification dans un autre thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top