разумные ожидания для числа анимаций CALayer одновременно? - PullRequest
2 голосов
/ 13 июля 2010

Я использую блоки анимации UIView для анимации свойств CALayer (в данном случае backgroundColor) на нескольких слоях на экране одновременно.

Все слои непрозрачны, и я анимирую все в одном блоке, по сути, так:

[UIView beginAnimations:@"outer" context:nil];
float duration = .25;
float offset = 0.0;
for( NSArray *viewsInPass in viewQueue ) {
   for( UIView *innerView in viewInPass ) {
       [UIView beginAnimations:@"inner" context:nil];
       [UIView setAnimationDelay:offset];
       [UIView setAnimationDuration:duration];
       [innerView.layer setBackgroundColor:[newColor CGColog]];
       [UIView commitAnimations];
   }
   offset += duration;
}
[UIView commitAnimations];

Как только у этого есть 4-5 одновременных слоев, анимирующих их цвет фона, это становится очень изменчивым, и устройство фактически начинает пропускать свою скорость рендеринга полностью и просто останавливается до конца оставшихся анимаций. Все виды не перекрываются, и все они непрозрачны и обычно имеют размер около 20x20 пикселей.

Я был немного шокирован тем, насколько это бесполезно, особенно после прочтения очень многих приятных вещей о Quartz 2D и т. Д. Я чувствую, что, должно быть, здесь упускаю что-то фундаментальное!

Помощь!

Ответы [ 3 ]

2 голосов
/ 13 июля 2010

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

Мне удалось получить одну большую анимацию со скоростью ~ 30 кадров в секунду (т. е. весь экран), но я столкнулся с ограничением памяти (оригинальный iPhone / iPod), что в конечном итоге убило меня за это.Если вам нужно больше, чем то, что вы получаете, вам нужно войти в OpenGL - либо через игровую среду, либо напрямую.Затраты на вызовы target-C в этом цикле, позволяющие изменять смещение в то время, когда вы циклически проходите по изображениям, в конечном итоге вас убьют.

1 голос
/ 13 июля 2010

Оказывается, проблема в том, что все, что вам нужно, это добавить какой-нибудь эпсилон между смещениями, с которых вы начинаете. Вы получаете анимацию n * 2 в конце каждого прохода и начало следующего на мгновение. По какой-то причине это делает систему анимации помехой, даже если это просто фрагмент обработки, которым они делятся.

Как это сделать

смещение + = длительность * 1,05;

разрешил рывки между проходами, которые засоряли анимацию.

1 голос
/ 13 июля 2010

Редактировать: [удалено]

Поскольку каждая анимация начинается с момента окончания предыдущей, вы можете запускать каждую из них в обратном вызове NSTimer или делегате didFinish вместо постановки в очередь всех анимаций одновременно.Это приведет к меньшему спросу на систему анимации.

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

...