Проблемы с задержкой анимации CABasic в IOS 5 и RemoteIO - PullRequest
5 голосов
/ 02 января 2012

Я создаю музыкальный инструмент для iPhone.В моем приложении, когда я касаюсь CALayer, воспроизводится заметка, и слой покачивается на протяжении всей заметки.

Все это прекрасно работало на iOS 4.1, однако я просто обновился до iOS 5.0.1 и столкнулся с серьезными проблемами с запаздыванием, если последовательно нажимал несколько заметок.После большой боли я сузил его до следующего кода анимации покачивания для CALayer, к которому прикоснулись.

// here is an example wiggle
CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"transform"];
wiggle.duration = 0.1;
//wiggle.repeatCount = 1e100f;
wiggle.repeatCount = 100;
wiggle.autoreverses = YES;
wiggle.toValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z
wiggle.fromValue = [NSValue valueWithCATransform3D:CATransform3DRotate(fret.fretLayer.transform,-0.2, 0.0 ,1.0 ,2.0)]; //angle, x , y , z

// doing the wiggle
[note.noteLayer addAnimation:wiggle forKey:@"wiggle"];

Если я блокирую последнюю строку, где анимация добавляется в слой, все лаги немедленно исчезают.Такое ощущение, что основной поток каким-то образом заблокирован или не работает в основном потоке, но я попытался вызвать функцию с executeSelectorOnMainThread: withObject: waitUntilDone: NO, и это не имело никакого значения.Если я нажимаю множество заметок очень быстро, все приложение приостанавливается, а затем, через секунду или около того, оно как будто догоняет само себя, и вдруг все звуки воспроизводятся, и анимация, наконец, начинает все прерывисто и задыхаться после этого.* Кто-нибудь знает какие-нибудь необычные проблемы с CABasicAnimation в iOS 5?Есть ли какие-нибудь альтернативные API анимации, которые я мог бы попробовать, которые также могли бы анимировать CALayers на неопределенную продолжительность при повторении?У кого-нибудь есть какие-либо предложения или предположения относительно того, как исправить / из чего может возникнуть проблема?

РЕДАКТИРОВАТЬ: я решил, что это определенно не имеет ничего общего с природой анимации.Я заменил код покачивания на код, который просто затемняет цвет, но я все еще получаю тот же эффект лага, когда ноты играют с задержкой.

CABasicAnimation *wiggle = [CABasicAnimation animationWithKeyPath:@"backgroundColor"];
wiggle.duration = 2;
wiggle.toValue = (id)[UIColor whiteColor].CGColor ;
wiggle.fromValue = (id)[UIColor colorWithRed:0.1 green:0.2 blue:0.8 alpha:0.4].CGColor;

Подозреваю, что это может быть связано с изменениемв CoreAudio / RemoteIO что ли?И что мешает основной ветке или наоборот?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Наконец выяснили истинную природу того, что вызывало проблему.Оказывается, есть проблема с использованием shouldRasterize = YES в iOS 5.

В моем приложении я встраиваю 100+ CALayers в UIView, у которого слой установлен в shouldRasterize = YES.Я создал новое приложение с нуля и добавил биты, пока я не повторил проблему.В конечном итоге это оказалось так.В iOS 4 это не проблема.В iOS 5 это так.Если я отключу Rasterize, проблема немедленно исчезнет.

Отправили сообщение об ошибке с яблоком.

0 голосов
/ 13 января 2012

Только для теста, попробуйте заменить CABasicAnimation на [UIView beginAnimation / commitAnimation].

...