Как предотвратить блокировку Core Animation моего основного потока? - PullRequest
2 голосов
/ 27 февраля 2009

Мне известно о том, что Core Animation отправляет свои анимации в отдельном потоке, как указано в документации. Тем не менее, моя анимация, кажется, блокирует мой основной поток. Все анимации запускаются и финны. (С kCATransactionDisableActions или без него, установленной как true.), Но становится нервным, и основной цикл выполнения останавливается.

Что я делаю не так?

Концептуальный пример:

[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];    
}

Ответы [ 2 ]

7 голосов
/ 27 февраля 2009

Создание 30 новых анимаций в секунду - это действительно плохая идея, а не то, как Core Animation была предназначена для использования. Базовая анимация была разработана на основе идеи, что вы сообщаете системе, где вы хотите, чтобы ваш слой (или слой со слоем) заканчивался, и он вычисляет остальное, включая количество кадров, которые нужно отбросить для запуска анимации за указанный вами период предоставлять. Сами анимации будут выполняться в фоновом потоке, но я считаю, что сначала нужно выполнить небольшую настройку, которая выполняется в вызывающем потоке (обычно в основном потоке). Эта настройка может занять больше 1/30 секунды, что приведет к перегрузке вашего основного потока.

Ваша цель должна состоять в том, чтобы минимизировать количество взаимодействия с Core Animation. Если у вас есть сложная, но запрограммированная траектория движения (или другое изменение свойства), установите все это заранее, используя CAKeyframeAnimation, и просто вызовите эту анимацию один раз. Если есть что-то в движении вашего объекта, которое необходимо изменить в ответ на пользовательский ввод, делайте это только тогда, когда вы получите фактический ввод. Изменение свойства середины анимации CALayer заставит его плавно переместиться из середины текущей траектории движения в новое место назначения.

Если вы работаете с Core Animation таким способом, вы можете одновременно анимировать до 50 движущихся полупрозрачных слоев со скоростью 60 кадров в секунду на iPhone.

1 голос
/ 27 февраля 2009

Учитывая, что вы запускаете анимацию 30 раз в секунду, я могу представить, что вы перегружаете систему. У предыдущей анимации есть время, чтобы запустить новую?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...