CATransiton Flicker с фоновой анимацией - PullRequest
3 голосов
/ 13 мая 2011

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

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 я постоянно получаю высокие 40–50 средних в FPS.

Ответы [ 2 ]

0 голосов
/ 17 мая 2011

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

Вы можете попробовать заключить в скобки свои изменения в сцене, как это:

[ CATransaction begin ]
... your animations ...
[ CATransaction commit ] ;
0 голосов
/ 17 мая 2011

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

...