CATransiton Flicker с фоновой анимацией

Я использую CATransition для перетасовки CALayer в UIView (UIView не в полноэкранном режиме). Новый слой входит справа, а старый слой уходит слева. Свойства содержимого CAlayer имеют значение CGImageRefs. Вот что я считаю подходящим кодом:

CATransition *transition = [CATransition animation];

transition.duration = transitionTime;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;

transition.delegate = self;
[view.layer addAnimation:transition forKey:nil];

// onDeck is the layer stage-right and is about to enter
[view.layer addSublayer:onDeck];    

// onStage is the layer currently in the middle of the view and is exiting
if (onStage)
   [onStage removeFromSuperlayer];

Появляется эта анимация, есть пауза в 1 секунду, а затем новое изображение анимируется и т. Д., И т. Д. Это прекрасно работает в симуляторе, но на моем iPod Touch 2-го поколения в анимации иногда возникают сбои. В частности, слой, в котором выполняется анимация, будет мерцать поверх текущего отображаемого слоя. Эти мерцания непостоянны, но заметны.

Что я сузил до вероятных виновников, так это фоновые анимации, которые я использовал за этим переходом. Несколько десятков CAlayer вылетают и выходят из полноэкранного режима на заднем плане. Когда я удаляю эти фоновые анимации или устанавливаю продолжительность анимации для перехода на гораздо большую продолжительность (2 секунды +), анимация работает нормально (я бы хотел, чтобы время анимации составляло 0,75 секунды).

Моя первая мысль (которая, кажется, подтверждается приведенными выше наблюдениями) заключается в том, что я слишком сильно нажимаю на CoreAnimation (по крайней мере, для моего iPod) и мне нужно идти на компромисс. Я не могу принять это из-за того, что сцена отображается очень хорошо (практически без задержек), если не считать этого случайного мерцания.

Если у кого-то есть какие-либо комментарии по этой проблеме или оптимизации CoreAnimation в целом, я был бы очень признателен!

Спасибо за чтение

Обновление:

Была возможность протестировать это на iPhone 4, и мерцания не произошло. Вдобавок инструмент CoreAnimation подтвердил, что на моем iPod Touch 2-го поколения я постоянно получаю от 40 до 50/50 FPS.


person Sam    schedule 13.05.2011    source источник


Ответы (2)


Просто предположение: пробовали ли вы вообще управлять своими CAT-транзакциями?

Вы можете попробовать заключить в скобки свои модификации сцены следующим образом:

[ CATransaction begin ]
... your animations ...
[ CATransaction commit ] ;
person nielsbot    schedule 17.05.2011
comment
Я пробовал это, и, к сожалению, никакого эффекта не наблюдается (что интересно, потому что у меня создалось впечатление, что с CATransiton связана неявная CATransaction). - person Sam; 17.05.2011
comment
Вы пробовали изображения с более низким разрешением на перемещаемых слоях? После завершения перехода вы можете перейти к изображениям с высоким разрешением. - person nielsbot; 18.05.2011
comment
Отличное предложение! Оказалось, что мои художественные активы были слишком велики для того размера, до которого они в конечном итоге будут уменьшены. Немного уменьшив их размеры и разрешение, я смог получить необходимую производительность. - person Sam; 18.05.2011
comment
Кстати, я догадался об этом, потому что начал задаваться вопросом, не ограничивалась ли пропускная способность вашего графического процессора (текстуры) .. - person nielsbot; 19.05.2011

Я бы избавился от всех теней (если они есть), а затем проверял, улучшилась ли производительность. Я видел, что тени, особенно тени на CAShapeLayers, имеют большое влияние на плавность анимации.

person elibud    schedule 16.05.2011
comment
Спасибо за предложение. Однако ни на одном из слоев нет теней. - person Sam; 17.05.2011