天天看點

【amazing cocos2d-x 3.0之十五】記憶體管理(3):如何優化記憶體使用1. 記憶體優化原理2. 記憶體優化水準3. 提示和技巧

1. 記憶體優化原理

為優化應用記憶體使用,開發人員首先應該知什麼最耗應用記憶體,答案就是紋理! 紋理幾乎會占據90%應用記憶體。是以盡量最小化應用的紋理記憶體使用,否則應用很有可能會因為低記憶體而崩潰。 本文介紹Cocos2d-x遊戲通用的兩條記憶體優化原理指導。

(1)認識瓶頸尋找方案

什麼樣的紋理最耗應用記憶體?或這些紋理會消耗多少記憶體?當然這個不用手動計算,隻需猜測。 工具在這裡已經準備好了。使用的是蘋果的工具“Allocation & Leaks”。你可以在Xcode中長按“Run”指令,選擇“ Profile ”來啟動這兩個工具。如下所示:

【amazing cocos2d-x 3.0之十五】記憶體管理(3):如何優化記憶體使用1. 記憶體優化原理2. 記憶體優化水準3. 提示和技巧

使用Allocation工具可以監控應用的記憶體使用,使用Leaks工具可以觀察記憶體的洩漏情況。 此外還可用一些代碼擷取遊戲記憶體使用的其他資訊,如下所示:

CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo();           

調用這個代碼後,遊戲便會在DEBUG模式運作,這時你會在Xcode控制台視窗看到一些格式工整的日志資訊。

Cocos2d: cocos2d: "cc_fps_images" rc=5 id=3 256 x 32 @ 16 bpp => 16 KB
Cocos2d: cocos2d: "XXX/hd/actor.pvr.ccz" rc=1059 id=4 2048 x 2048 @ 32 bpp => 16384 KB
Cocos2d: cocos2d: CCTextureCache dumpDebugInfo: 2 textures, for 16400 KB (16.02 MB)           

從上可以看到會顯示紋理的名稱、引用計數、ID、大小及每像素的位數。最重要的是會顯示記憶體的使用情況。如“cc_fps_images”指消耗了16KB記憶體,而“actor.pvr.ccz”消耗了16M記憶體。

(2)切勿過度優化

這是一個通用的優化規則。在優化過程中,應該做一些權衡取舍。因為有時候圖像品質和圖像記憶體使用是處于兩級的狀态。千萬不要過度優化!

2. 記憶體優化水準

在此将ccos2d-x記憶體優化分為三個等級。每個等級都有不同的說明,政策也有點不一樣。

(1)用戶端等級

這是最重要的的優化等級。因為我們要在Cocos2d-x引擎頂層編譯遊戲,引擎自身會提供一些優化選項。 在這個等級我們可以進行大部分優化。簡而言之,我們可以優化紋理、音頻、字型及粒子的記憶體使用。

第一: 看紋理優化,為了優化紋理記憶體使用,必須知道什麼因素對紋理記憶體使用的影響最大。主要有3個因素會影響紋理記憶體,即紋理格式(壓縮還是非壓縮)、顔色深度和大小。我們可以使用PVR格式紋理減少記憶體使用。推薦紋理格式為pvr.ccz。紋理使用的每種顔色位數越多,圖像品質越好,但是越耗記憶體。是以我們可以使用顔色深度為RGB4444的紋理代替RGB8888,這樣記憶體消耗會降低一半。此外超大的紋理也會導緻記憶體相關問題。是以最好使用中等大小的紋理。

第二: 音頻優化,3個因素會影響音頻檔案的記憶體使用,即音頻檔案資料格式、比特率及采樣率。推薦使用MP3資料格式的音頻檔案,因為Android平台和iOS平台均支援MP3格式,此外MP3格式經過壓縮和硬體加速。背景音樂檔案大小應該低于800KB,最簡單的方法就是減少背景音樂時間然後重複播放。音頻檔案采樣率大約在96-128kbps為佳,比特率44kHz就夠了。

第三:字型和粒子優化,在此有兩條小提示:使用BMFont字型顯示遊戲分數時,請盡可能使用最少數量的文字。例如隻想要顯示機關數的數字,你可以移除所有字母。至于粒子,可以通過減少粒子數來降低記憶體使用。

(2)引擎等級

需要OPENGLES及遊戲引擎高手

(3)C++語言等級

在這個等級中,建議是編寫無記憶體洩露代碼。遵循Cocos2d-x内置的記憶體管理原則,盡量避免記憶體洩露。

3. 提示和技巧

(1)  一幀一幀載入遊戲資源

(2)  減少繪制調用,使用“Use CCSpriteBatchNode”

(3)  載入紋理時按照從大到小的順序

(4)  避免高峰記憶體使用

(5)  使用載入螢幕預載入遊戲資源

(6)  需要時釋放空閑資源

(7)  收到記憶體警告後釋放緩存資源.

(8)  使用紋理打包器優化紋理大小、格式、顔色深度等

(9)  使用JPG格式要謹慎!

(10)  請使用RGB4444顔色深度16位紋理

(11)  請使用NPOT紋理,不要使用POT紋理

(12)  避免載入超大紋理

(13)  推薦1024*1024 NPOT pvr.ccz紋理集,而不要采用RAW PNG紋理

繼續閱讀