2012-01-02 32 views
5

Tôi đang tạo nhạc cụ cho iPhone. Trong ứng dụng của tôi khi tôi chạm vào một CALayer một ghi chú phát và lớp làm lung lay trong suốt thời gian lưu ý.Sự cố lag CABasicAnimation với IOS 5 và RemoteIO

Đây là tất cả hoạt động hoàn hảo trên iOS 4.1, tuy nhiên tôi vừa nâng cấp lên iOS 5.0.1 và gặp phải các vấn đề lớn về độ trễ nếu tôi nhấn nhiều lần liên tiếp. Sau nhiều đau đớn, tôi đã thu hẹp nó xuống mã hoạt hình lung linh sau đây cho CALayer được chạm vào.

// 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"]; 

Nếu tôi chặn dòng cuối cùng nơi hoạt ảnh được thêm vào lớp, tất cả độ trễ sẽ biến mất ngay lập tức. Nó cảm thấy như thread chính đang bị chặn bằng cách nào đó, hoặc nó không chạy trên thread chính, nhưng tôi đã cố gắng gọi hàm với performSelectorOnMainThread: withObject: waitUntilDone: NO và nó không có sự khác biệt. Nếu tôi nhấn vô số ghi chú thực sự nhanh chóng thì toàn bộ ứng dụng tạm dừng, và sau đó một giây hoặc lâu hơn nó giống như nó bắt kịp với chính nó và đột nhiên tất cả các phát âm thanh và hoạt ảnh cuối cùng bắt đầu tất cả choppy và nghẹt thở sau đó.

Có ai biết về bất kỳ sự cố bất thường nào với CABasicAnimation trong iOS 5 không? Có bất kỳ API hoạt ảnh thay thế nào mà tôi có thể thử cũng có thể tạo hoạt ảnh cho CALayers trong một khoảng thời gian không xác định lặp lại không? Bất cứ ai có bất cứ đề nghị hoặc đoán như thế nào để sửa chữa/những gì vấn đề có thể xuất phát từ?

EDIT: Tôi đã xác định chắc chắn không có gì liên quan đến bản chất của hoạt ảnh. Tôi đã thay thế mã giả lập bằng mã đơn giản làm mờ màu như vậy, nhưng tôi vẫn nhận được hiệu ứng lag tương tự với các ghi chú bị lag khi chơi.

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; 

Nghi ngờ nó có thể liên quan gì đến sự thay đổi trong CoreAudio/RemoteIO? Và đó là can thiệp vào chủ đề chính hoặc ngược lại?

Trả lời

1

Cuối cùng đã tìm ra bản chất thực sự của những gì đã gây ra sự cố. Hóa ra có vấn đề với việc sử dụng shouldRasterize = YES trong iOS 5.

Trong ứng dụng của tôi, tôi đang nhúng 100+ CALayers vào UIView đã đặt lớp của nó thành shouldRasterize = YES. Tôi tạo ra một ứng dụng mới từ mặt đất lên và thêm vào bit cho đến khi tôi nhân rộng vấn đề. Cuối cùng hóa ra là thế này. Trong iOS 4, đây không phải là vấn đề. Trong iOS 5 nó là. Nếu tôi bật shouldRasterize, vấn đề sẽ biến mất ngay lập tức.

Đã gửi báo cáo lỗi bằng quả táo.

0

Chỉ để thử nghiệm, hãy thử thay thế CABasicAnimation bằng [UIView beginAnimation/commitAnimation].

+0

Hoạt ảnh UIView có hoạt động trên CALayers không? Tôi đã thử viết mã của riêng mình và cũng đã thử sử dụng câu trả lời hàng đầu từ đây: http://stackoverflow.com/questions/929364/how-to-create-iphones-wobbling-icon-effect nhưng cả hai đều có cùng tác dụng dường như bỏ qua các chức năng và chỉ chạy mã số fret.fretLayer.transform = CATransform3DMakeRotation (-0.2, 0.0, 1.0, 2.0) khi nó chạy qua nó (vì vậy chỉ chạy nó một lần). Câu trả lời hàng đầu đó từ liên kết tôi đã đăng dường như sử dụng CGAffineTransform thay vì CATransform3D nhưng tôi không thể áp dụng trực tiếp CGAffineTransform cho CALayers? Bất kỳ ý tưởng nào? (Ps.thanks) – chopsalot