2009-01-28 39 views
1

我在iPhone上設置了一個非常簡單的「遊戲」。事物四處移動,旋轉,可以與它們交互等等。在模擬器中,它運行良好,但在設備上它的速度大約爲0.25 FPS,而且速度很慢,顯然沒有時間識別觸摸。如何在iPhone上手動設置動畫效果?

這最初只是使用UIView和Item的數組,每個數組都有一個Tick和一個Draw函數。在應用程序開始時,我開始了一個定時器,它以60 FPS拍攝,它叫Tick,在Tick結束時,它調用[self setNeedsDisplay];

它的工作速度非常慢,所以我將Item類轉換爲CALayer類的子類,移動圖層而不是重繪項目。但是,我正在手動,逐幀地移動CALayer,而這顯然不是好的。它仍然太慢。所以我告訴它移動到它的最終目的地,並給它一個等於它到達那裏所需的滴答數量的長度。

工作正常,但有些情況下,如果您與某些東西交互,應該停止移動,並改爲執行其他操作。所以我回到移動每個訂單,而不是設置新的頭寸,而是將其包裝在CATransaction中,併爲交易賦予與tick相同的長度。

工程確定,但新的問題出現了:如果我想動畫的東西,我仍然要使用[自setNeedsDisplay]每一個刻度,它調用drawInContext:,這似乎是一個主要放緩的問題。

是不是隻有一種方法來手動繪製像我之前做的一切?我只是在進行CGContext *調用,並且它在模擬器中工作正常!如果我在J2ME或嵌入式C++中實現類似的東西,它會工作的很好。我錯過了什麼?我真的需要學習OpenGL來做任何有趣的手動動畫嗎?

回答

0

我發現真正的問題是需要撥打[self setNeedsDisplay]。在逐幀的基礎上重新繪製是不好的mojo。所以我大部分都是使用圖像,而且我仍然可以通過將CALayer上的動作設置爲null來逐幀設置位置。具體來說:

NSMutableDictionary *customActions=[NSMutableDictionary dictionaryWithDictionary:[self actions]]; 
[customActions setObject:[NSNull null] forKey:@"position"]; 
[customActions setObject:[NSNull null] forKey:@"transform"]; 
[customActions setObject:[NSNull null] forKey:@"opacity"]; 
self.actions=customActions; 

在那次調用之後,一幀一幀地計算時,一切都會快得多。

2

不確定CG動畫層,但OpenGLES是iPhone對高性能圖形的答案。在這一天結束時,你將獲得更好的表現。 openGLES可能是一個痛苦的工作,但如果你從工作代碼開始(請參閱應用程序的紋理和視圖類的crashlanding),你應該能夠足夠的抽象出你需要的東西。

誠實地說,我不太喜歡使用openGLES來畫一些2D精靈,但是我得到了一個大約50fps的完整物理引擎和腳本層,所以我猜這是值得的。

0

不幸的是,這聽起來像是有點重寫,但你看過Cocos2d引擎嗎?如果你所要做的只是在屏幕上製作一系列精靈動畫,那麼你可以在所有的OpenGL調用中使用很好的Objective-C包裝。

http://code.google.com/p/cocos2d-iphone/

1

如果你需要做的是動畫的東西從A點移動到B點,UIView的和CALayer的比能處理這個多。你真的,真的不想在iPhone上使用Core Graphics,UIViews或Core Animation手動更改精靈的位置,速度爲60 FPS。

對於使用CALayer的簡單的動作,你應該能夠做到以下幾點:

[CATransaction begin]; 
[CATransaction setValue:[NSNumber numberWithFloat:0.5f] forKey:kCATransactionAnimationDuration]; 

CGSize spriteSize = currentSprite.frame.size; 
currentSprite.frame = CGRectMake(newPosition.x, newPosition.y, spriteSize.width, spriteSize.height); 

[CATransaction commit]; 

與currentSprite是您的CALayer並在newPosition作爲整個線性移動的終點。這將使用恆定速度從當前位置平滑地移動到新位置。

使用Core Animation,您只需指定圖層的最終位置,並讓它執行插入中間幀的工作。如果您通過給予另一個動畫在同一圖層上執行來中斷此動畫,它甚至可以平滑地從移動到一個位置過渡到另一個位置。使用CAKeyframeAnimations可以設計更復雜的動畫。再次,給Core Animation提供開始和結束狀態,並讓其餘的優化。使用UIViews,這是CALayers周圍的輕量級包裝,我在設備上獲得至少30 FPS,同時有數十個半透明層一次移動。

相關問題