2012-01-02 72 views
5

我正在爲iPhone創建樂器。在我的應用程序中,當我觸摸CALayer時,會彈奏一個音符,該音符在音符的持續時間內會發生擺動。CABasicAnimation與IOS 5和RemoteIO的滯後問題

這完全在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"]; 

如果我屏蔽掉的最後一行,其中動畫被添加到層中的所有滯後立即消失。感覺主線程以某種方式被阻塞,或者它不在主線程中運行,但是我嘗試用performSelectorOnMainThread調用函數:withObject:waitUntilDone:NO,它沒有任何區別。如果我真的很快地按下大量的音符,整個應用程序就會暫停,然後一秒鐘左右它就會跟上它自己,突然間所有的聲音都會播放,並且動畫終於開始全部斷斷續續,然後戛然而止。

有誰知道iOS 5中的CABasicAnimation有什麼不尋常的問題嗎?有沒有其他的動畫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的變化有關嗎?這是干擾主線程還是反過來呢?

回答

1

終於找出了導致問題的真正原因。結果在iOS 5中使用shouldRasterize = YES時出現問題。

在我的應用程序中,我將100多個CALayers嵌入到UIView中,其圖層設置爲shouldRasterize = YES。我從頭開始創建了一個新應用程序,並添加了一些內容,直到我複製了問題。最終它變成了這個。在iOS 4中,這不是一個問題。在iOS 5中是這樣的。如果我打開shouldRasterize,問題會立即消失。

已經向蘋果提交了一個錯誤報告。

0

只是爲了測試,嘗試用[UIView beginAnimation/commitAnimation]替換CABasicAnimation。

+0

UIView動畫是否適用於CALayers?我試圖寫我自己的代碼,並嘗試使用從這裏頂部的答案:http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect但都具有相同的效果,似乎忽略這些函數只是運行在它通過它的代碼(因此只運行一次)中。fret.fretLayer.transform = CATransform3DMakeRotation(-0.2,0.0,1.0,2.0) 代碼。 從我發佈的鏈接的頂部答案似乎使用CGAffineTransform而不是CATransform3D,但我似乎不能將CGAffineTransform直接應用於CALayers? 有什麼想法?(ps.thanks) – chopsalot 2012-01-14 19:41:11