2012-08-13 107 views
1

我正在製作一個勝利狀態和失敗狀態的遊戲。對於每個州,我想顯示一個2-3秒的簡短動畫。第一個動畫由60個PNG組成,速度爲30 fps,第二個動畫由80個PNG組成,也是30fps。我已經嘗試了各種方法,並廣泛搜索了一個解決方案,但我一直髮現的前兩個結果是使用UIImageView animationImages和Core Animation。使用UIImageView在模擬器中工作得非常好,但需要永遠在設備上第一次運行。我認爲這是因爲圖像需要加載到內存中。我正在使用「imageNamed」來填充animationImages數組,但我猜他們需要在第一次調用動畫時渲染?我曾嘗試在應用程序加載時預渲染它們,並且這看起來有訣竅,但預渲染所有這些圖像需要近10秒,這不方便用戶使用。我也會開放使用核心動畫,但我對它的知識非常有限,所以詳細的解釋將不勝感激。謝謝!什麼是動畫iPhone上的圖像序列的最佳方式?

當你說我需要在應用程序啓動時加載所有內容時,你究竟是什麼意思?現在,我初始化動畫圖像的兩個數組時,應用程序加載,這樣的:

// Create thinnestAnimation Array 
thinnestAnimation = [[NSMutableArray alloc] init]; 
for(int i = 1; i <= 60; i++) 
{ 
    UIImage *thinImage = [UIImage imageNamed:[NSString stringWithFormat:@"ThinnestJump_%d.png", i]]; 
    [thinnestAnimation addObject:thinImage]; 
} 

thinAnimationImageView.animationImages = (NSArray *)thinnestAnimation; 
thinAnimationImageView.animationDuration = 2.0; 
thinAnimationImageView.animationRepeatCount = 1; 

thinAnimationImageView是我的接口一個IBOutlet,我打電話[thinAnimationImageView startAnimating];當我想動畫圖像序列。這在第一次通話中嚴重滯後,但此後很好。無論如何阻止它第一次落後?

+0

對不起,動畫的計算成本很高。蘋果公司儘可能地寫了UIImageView。用它。 – 2012-08-13 05:03:34

+0

如果您已經預渲染了您只想依次繪製的幀,Core Animation將無法真正幫助您;對於涉及移動或轉換現有圖像(或一組圖像)和/或添加某些特殊效果的動畫而言更是如此。現在,如果您想要的視覺類型符合該描述,則可以使用CA而不是圖像序列。 – rickster 2012-08-13 05:26:55

+0

你也可以看看你可以做什麼來優化你的圖像。他們有阿爾法?他們真的需要它嗎?屏幕的大面積是否會改變每一幀,或只是一小部分?視頻是否可以更好地發揮作用? – rickster 2012-08-13 05:28:04

回答

1

UIImageView的內置動畫功能是一個很好的做法。但是,在需要動畫之前,您需要加載所有內容,例如在應用程序的啓動時。如果您需要準備多個不同的動畫,請在啓動時加載多個UIImageView對象,並使用其startAnimating方法稍後調用您需要的那個。

還有其他方法可以進行動畫製作,例如使用使用OpenGL進行動畫製作的Cocos2D,性能更快。但是,您已經完全在不同的框架中構建您的應用程序,這可能是矯枉過正的,這取決於應用程序中發生了什麼。

+0

至於在啓動時加載UIImageView對象,我已初始化它們,但第一次運行的動畫仍然滯後。相反,我在啓動時在隱藏視圖中執行了兩個動畫,所以當用戶使用該應用程序時,它們很適合。唯一的缺點是需要6-8秒來加載應用程序。 – cricket4lyfe921 2012-08-19 04:12:29

+0

如果你有一個動畫重量級的應用程序,你可能會考慮除UIKit以外的其他庫,例如Cocos2D – johnbakers 2012-08-19 10:12:39

+0

它只是這兩個短小的動畫 – cricket4lyfe921 2012-08-20 00:03:06

1

正如安德魯斯的UIImageView提到已經內置動畫

的屬性喜歡你有圖像(imgarray)的陣列和圖像視圖

對於創建圖像

NSMutableArray *imgarray = [NSMutableArray arrayWithCapacity:100] 
for (int i = 0; i < 100; ++i) { 
    NSString *name = [NSString stringWithFormat:@"img%d.png",i]; 
    UIImage *image = [UIImage imageNamed:name]; 
    [imgarray addObject:image]; 
} 

的陣列然後,對於動畫

UIImageView *imgview; 

imgview.animationimages=imgarray; 

然後設置

imgview.animationDuration=2.0; //in seconds 

    [imgview startAnimating]; 

stopanimating停止動畫 並且還有動畫

希望這有助於重複計數屬性.....

0

你可能想看看this article有關使用的CALayer用精靈表做動畫。與Spritesheet相比,圖層的開銷更小。

0

晚的答案,但我只是處理了這個自己,發現以下有用的:

底部的第3個答案的,Animation using array of images in sequence

基本上,使用imageNamed:執行不是直接從包拉你的圖片速度更慢。這就是我所做的多數民衆贊成使我的加載速度更快:

NSMutableArray *imagesArray = [NSMutableArray new]; 

for (int i = 0; i < 150; i++) 
{ 
    [imagesArray addObject:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"pngSlice-%d", i] 
                          ofType:@"png"]]]; 
} 

self.myImageView.animationImages = imagesArray; 
self.myImageView.animationRepeatCount = 1; 
self.myImageView.animationDuration = 2.5; 

[self.myImageView startAnimating]; 

imagesArray = nil; 

如果直接添加圖像到捆綁,並有這工作他們都按順序命名(即pngSlice-0,pngSlice-1,pngSlice-2 ,...)。我有150個圖像,更改條件以匹配您的圖像總數。

相關問題