2009-12-01 14 views
2

我正在編寫一個相當基本的應用程序。它使用最少的觸摸輸入,並且大多隻是播放花哨的動畫。沒有太多的動畫,但它目前做的方式似乎超級低效,並使用太多的內存。iPhone動畫效率解決方案,分層問題

該視圖分爲兩部分,底部的1/5只是一個永遠不會改變的圖像。其餘部分是動畫播放的地方。目前通過將32個圖像加載到一個數組中,然後通過它們播放(8fps)來完成。它通過每個動畫共進行4次。圖片不是很大,但它們還是很大。我還想知道存儲它們的最佳文件格式,無論是在整體大小還是所需的開銷方面。

這是一個超級簡單的方法,它的工作原理,但它似乎並沒有削減它memwise,它使用太多。

我的建議是,建立分類動畫爲若干層,因爲有幾件事情,我認爲可以做不同的:

  • 使背景一個靜態圖像,所以它並沒有成爲一部分的動畫
  • 取出一些「裝飾物」,例如移動圖形和進度條,並在動畫的頂部或下方製作自己的部分透明圖層。就我未來的創作自由而言,這也將打開大門。
  • 剪出頂部的文字,並使用iPhone以編程方式顯示文字。使用iPhone繪製文本或加載帶有文本的圖像會更好嗎?主要是Web Dev,我覺得加載任何帶有文本的圖像是很愚蠢的。
  • 在將這些內容剪切爲動畫時將剩下的內容播放出去,而這些內容會顯着縮小。

總的來說,我們正在尋找1個靜態背景,3-5個小動畫和一個大型動畫。我是否可以使用圖層將這些元素全部分開,並更多地依靠iPhone來繪製最終圖像?那是我認爲我可以讓它運行得更好一點的地方,將所有內容合併成一張翻頁幻燈片的大圖似乎很愚蠢,但您可以加載一些在應用程序範圍內使用的較小的元素,並且更有效地做事情。

或者,我是否完全過分複雜,有沒有更好的方法去做呢?

編輯:我一直在瀏覽,看來使用圖層會更有效率。不過,我也有另外一個問題。將動畫的每一幀作爲自己的文件並加載到數組中以獲得動畫,或者讓所有幀都有一個巨大的精靈圖表圖像,並讓iPhone從精靈圖表中使用座標編程?

編輯2:我們一直以來努力的一切了,check it out on the App store.

回答

0

這是我用來解決問題的極早期版本。我很清楚,這並不是什麼接近理想的東西,但它是有效的。如果你覺得你需要更好地寫出這些,那麼一定要這樣做。我會盡力記住稍後再回來發佈更新。

這個計時器失去了0.1秒的準備時間,所以如果你把它設置爲28fps,圖像渲染速度爲28fps,它會丟幀,但相當不明顯。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"VDL"); 
    [animationFrame initWithInteger:1]; 
    [self animation]; 
    NSLog(@"VDL Completed"); 
} 

- (void)animation { 
    CGRect animationRect = CGRectMake(0, 0, 320, 384); 
    //NSLog(@"animationRect defined"); 
    animationImages = [[UIImageView alloc] initWithFrame:animationRect]; 
    [self.view addSubview:animationImages]; 
    //NSLog(@"animationImages allocated, init'd"); 
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.0357 target: self selector:@selector(blah) userInfo:nil repeats:YES]; 
    [animationImages setImage:[UIImage imageNamed:[NSString stringWithFormat:@"SCAN%d.jpg", animationFrame]]]; 
    //NSLog(@"animationTimer started"); 
    animationTimer = nil; 
    //NSLog(@"animationTimer set to nil"); 
} 

- (void)blah { 
    if (animationFrame <= 336){ 
     animationFrame += 1; 
     [animationImages setImage:[UIImage imageNamed:[NSString stringWithFormat:@"SCAN%d.jpg", animationFrame]]]; 
     NSLog(@"%d", animationFrame); 
    } 
    else { 
     animationFrame = 1; 
     NSLog(@"restart"); 
    } 
} 
1

假設總的動畫序列是靜態的,你是最好的辦法是編譯成電影,並使用視頻播放器框架播放:

MPMoviePlayerController 

這將允許iPhone使用自定義硬件的顯示器,並將保持電池使用率低。作爲用戶交互,你只需要設置movieControlMode屬性來防止用戶能夠與電影互動:

MPMovieControlModeHidden不要 顯示任何控件。此模式 可防止用戶控制 播放。

適用於iPhone OS 2.0及更高版本。

在MPMoviePlayerController.h中聲明。

+0

是否允許用戶控制視頻的播放?我們不希望這種情況發生。 – Sneakyness 2009-12-01 16:31:23

+1

完全不是,您可以選擇是否顯示用戶控件 – 2009-12-01 16:56:06

+0

從文檔中可以看出,它僅允許全屏幕電影?我需要電影播放不全屏。 – Sneakyness 2009-12-01 19:16:25