2011年2月17日

「IPHON, 轉貼紀錄」助你開發iOS game的基礎知識


Frame rate

簡單解說

iOS game的Frame rate就用60、30、15或10吧。

詳解

iOS Device的螢幕的刷新速度是60Hz(即每秒刷新60次),所以iOS game的frame rate可以是60的因數(這就是60、30、15等的由來)。
那該用那個因數才好?這沒有一個標準答案。高的Frame Rate會使動畫看起來更順,但對處理器效能要求也高。筆者的遊戲就使用了「30」這個Frame Rate,因為筆者曾作測試,這遊戲大約能在30下仍能保持平穩地執行。

動畫/圖片格式

簡單解說

iOS game的常見圖像格式是PNG及PVRTC。PNG圖像品質最好,但會佔用較多記憶體;PVRTC圖像品質相對較差,但佔用較少記憶體。

詳解

PNG是一種常見的圖像格式,大部份圖像軟體(包括小畫家、Photoshop、Flash)都支援。
要留意的是,PNG主要分為2種模式,一種是32Bit模式(在Photoshop選”File”–> “Save for web & device”,然後選”PNG-24″格式。嗯,雖然名稱上是「24」,但實際上是32Bit的),另一種是8Bit模式。在下文,”PNG”會泛指「32Bit模式的PNG」。
PNG的優點是圖像質素較佳,幾乎無失真,另外亦支援8Bit的精細透明度;
PVRTC則是一種冷門的圖像格式,大部份圖像軟體(包括Photoshop)都不會支援。
PVRTC的好處是佔用較小的記憶體(通常是2 或 4 bit per pixel),缺點是作了很大程度上的失真壓縮,因此圖像品質不及PNG精美。
PVRTC的品質有點似GIF,就是容易使圖像出現塊狀顏色。

Texture ﹠ Memory Management

簡單解說

假如把以下的火柴人小動畫以最高畫質的方式載入記憶體,大約會佔用1.6%記憶空間。

詳解

當程式把動畫、圖片(統稱為Texture)讀取後,會儲在相關圖像硬件的記憶體中。一幅Texture會耗用多少記憶體則視乎其bit per pixel (bpp),越高bbp畫質就越好,但也會耗用更多記憶體。最高的bpp是32。
至於應該用多少bpp,其中涉及的細節太多,有機會筆者另寫文章再介紹。
iPhone 3G支援最多24MB的Texture Memory,iPhone 3Gs或iPhone4則支援更多Texture Memory,但由於現時有不少iPhone 3G用家,所以筆者依然以「最多使用24MB」Texture Memory為限。據筆者的測試,假如載入超過24MB的texture後,遊戲就會當機。
上面的火柴人小動畫的長濶是50×100 pixels,總共有20格frame。假如使用32 bpp的話,這段動畫約佔用了391 KB 記憶體([50pixel] x [100pixel] x [20 number of frames] x [32 bit]),以iPhone 3G的24MB texture memory為上限,上面的動畫「理論上」佔用了1.6%的記憶體空間了。
單一個火柴人已佔用了1.6%空間,還未計背景、遊戲中的敵人、配角、按掣、聲效,可想而知iOS game的記憶體是非常珍貴,必需事前好好規劃。

Atlas

簡單解說

建議的圖像檔案儲存方法,如下圖所示,是把很多個圖像拼貼至一個大的圖像檔案去儲存。

詳解

以上面的火柴人小動畫為例,它總共有20格frame,其中一個最符合直覺的儲存方法是用20個PNG file來儲存。當讀取動畫時,就載入20張PNG file。
然而,這不是建議的做法,因為載入檔案本身會非常慢,同樣是20格frame,把20格frame拼貼在單一個大的PNG file會比分散在20個小的PNG file讀取得更快。這個「拼貼著20格frame」的單一PNG file就叫作Atlas。
此外,基於OpenGL架構的特性,處理1個Atlas比處理20個小Texture更有效率及快。
載入的Atlas的長闊必須是2的次方,例如256×256、512×512、1024×1024,假如Atlas的長闊是211×233,系統也會強制以256×256的大小來載入記憶體。

總結

以上的解說是筆者在研究Cocos2d及Sparrow這2套iOS game framework的所領悟的知識,希望可以幫到你。
兩套Framework都是以OpenGL為基礎的,假如你或你所使用的game framework並非以OpenGL為基礎的話,本文所提及的很多原則可能並不適用。
另外,這兩套framework都是2D framework,假如你開發3D game的話可能會遇到不同的細節。

Cocos2d pvr or pvrtc 格式圖檔

遊戲可以考慮使用Cocos2D來開發,會簡化不少的開發時間與流程,如動畫播完去呼叫程式,使用Cocos2D中Action的Sequence及CallFunc就可以輕易的達到要的效果。

另外若動畫張數多,您可以試著將圖檔格式轉為pvr或pvrtc看看,效能上會有顯著的提升,只是轉檔後的圖片品質,看您是否能夠接受了。