2012-05-11 140 views
0

我目前正在研究一個項目,我們正在實施一些核心動畫來調整大小/移動元素。我們已經注意到,在這些動畫中,許多Mac上的幀速率顯着下降,儘管它們相當簡單。這裏有一個例子:核心動畫:幀率

// Set some additional attributes for the animation. 
    [theAnim setDuration:0.25]; // Time 
    [theAnim setFrameRate:0.0]; 
    [theAnim setAnimationCurve:NSAnimationEaseInOut]; 

    // Run the animation. 
    [theAnim startAnimation]; 
    [self performSelector:@selector(endAnimation) withObject:self afterDelay:0.25]; 

是否明確說明的幀速率(比如60.0,而不是0.0離開它)把更多的優先考慮線程等等,爲此可能提高幀速率?有沒有更好的方法來完成這些動畫?

回答

6

The documentation for NSAnimation

0.0幀速率意味着儘可能快... 幀速率不保證

爲儘快應該去,合理,是與60 fps相同。


使用的Core Animation,而不是NSAnimation

NSAnimation是不是真正的Core Animation(它了AppKit的PAT)的一部分。我會建議嘗試核心動畫的動畫來代替。

  1. 添加QuartzCore.framework到項目
  2. 在你的文件中導入
  3. 在您設置動畫
  4. 切換到核心動畫的看法爲動畫設置東西向- (void)setWantsLayer:(BOOL)flag就像是

從上面的動畫持續時間開始,它看起來像「隱式動畫」(只是更改圖層的屬性)可能最適合您。但如果你想要更多的控制,你可以使用顯式的動畫,這樣的事情:

CABasicAnimation * moveAnimation = [CABasicAnimation animationWithKeyPath:@"frame"]; 
[moveAnimation setDuration:0.25]; 
// There is no frame rate in Core Animation 
[moveAnimation setTimingFunction:[CAMediaTimingFunction funtionWithName: kCAMediaTimingFunctionEaseInEaseOut]]; 
[moveAnimation setFromValue:[NSValue valueWithCGRect:yourOldFrame]] 
[moveAnimation setToValue:[NSValue valueWithCGRect:yourNewFrame]]; 

// To do stuff when the animation finishes, become the delegate (there is no protocol) 
[moveAnimation setDelegate:self]; 

// Core Animation only animates (not changes the value so it needs to be set as well) 
[theViewYouAreAnimating setFrame:yourNewFrame]; 

// Add the animation to the layer that you 
[[theViewYouAreAnimating layer] addAnimation:moveAnimation forKey:@"myMoveAnimation"]; 

然後在回調您實現

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)isFinished { 
    // Check the animation and perform whatever you want here 
    // if isFinished then the animation completed, otherwise it 
    // was cancelled. 
} 
+0

真棒!偉大的技巧大衛感謝 - 實施這個後,性能甚至不能與NSAnimation相提並論。更快,更快 – Zakman411