2009-02-27 18 views
2

Çekirdek Animasyonun animasyonlarını, belgelerde belirtildiği gibi ayrı bir iş parçacığı içinde gönderdiği gerçeğinin farkındayım. Yine de, animasyonlarım ana iş parçamı engelliyor gibi görünüyor. Tüm animasyonlar başlar ve finişlenir. (KCATransactionDisableActions öğesi true olarak ayarlanmış veya içermez.) Ancak ürkek ve ana runloop tezgahları haline gelir.Ana Animasyonu engelleyen Çekirdek Animasyonunu nasıl önleyebilirim?

Neyi yanlış yapıyorum?

Kavramsal örnek:

[NSTimer scheduledTimerWithTimeInterval:0.0333 target:self selector:@selector(gameEngine) userInfo:nil repeats:YES]; 

- (void)gameEngine 
{  
    [CATransaction begin]; 
    [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; 
    myLayer.position = CGPointMake(newX, newY); 
    [CATransaction commit];  
} 
+0

Kayıt için: OpenGL ES'ye dalışıyoruz. – Kriem

cevap

7

Bir saniyede 30 yeni animasyon oluşturmak gerçekten kötü bir fikirdir ve Core Animation'ın nasıl kullanılması amaçlanmamıştır. Çekirdek Animasyon, sisteme katmanınızın (ya da katman destekli görünümün) sonlanmasını istediğiniz yeri anlattığınız düşüncesiyle tasarlandı ve zaman çerçevesindeki animasyonu çalıştırmak için kaç karenin düşeceğini de dahil olmak üzere geri kalanını hesaplıyor. sağlamak. Animasyonların kendileri bir arka plan iş parçacığı üzerinde çalışır, ancak ilk önce çağrı iş parçacığı (genellikle ana iş parçacığı) üzerinde gerçekleşmesi gereken küçük bir kurulum olduğuna inanıyorum. Bu kurulum, saniyenizin 1/30'undan daha uzun sürebilir ve bu da ana iş parçacığınızı aşırı yükler.

Hedef, Çekirdek Animasyon ile etkileşim miktarını en aza indirmek için olmalıdır. Karmaşık ancak komut dosyasıyla yazılmış bir hareket yolunuz (veya başka bir özellik değişikliğiniz varsa), bir CAKeyframeAnimation kullanarak her şeyi önceden ayarlayın ve yalnızca bu animasyonu bir kez arayın. Nesnenizin, kullanıcı girdisine yanıt olarak değiştirilmesi gereken hareketiyle ilgili bir şey varsa, yalnızca gerçek girişi aldığınızda bunu yapın. CALayer orta animasyonunun bir özelliğini değiştirmek, mevcut hareket yolunun ortasından yeni hedefine düzgün bir şekilde hareket etmesine neden olur.

Çekirdek Animasyon ile bu şekilde çalışıyorsanız, eşzamanlı olarak iPhone'da 60 FPS'de en çok 50 hareketli yarı saydam katman oluşturabilirsiniz.

1

Eğer bir animasyon 30 kez sana sistemde yığılma olan hayal ediyorum ikinci başlıyor düşünüldüğünde. Önceki animasyonlar, yeni bir tane yayınlamadan önce başlamak için zamana sahip mi?

+0

Yapıyorlar. Hepsi işe başlar ve finişlenir. (KCATransactionDisableActions olarak veya true olarak ayarlanmış.) Buna rağmen, Çekirdek Animasyon ana runloopumu engellememelidir. – Kriem

+0

CA bunalırsa, ana döngünüz gerçekten engelleyebilir. İplikler sonsuz kaynaklarla sihirli şeyler değildir. –

İlgili konular