為優化應用記憶體使用,開發人員首先應該知道什麼最耗應用記憶體,答案就是紋理! 紋理幾乎會佔據90%應用記憶體。所以盡量最小化應用的紋理記憶體使用,否則應用很有可能會因為低記憶體而崩潰。 本文介紹cocos2d-x遊戲通用的兩條記憶體優化原理指導。
什麼樣的紋理最耗應用記憶體?或這些紋理會消耗多少記憶體?當然這個不用手動計算,只需猜測。 工具在這裡已經準備好了。使用的是蘋果的工具「allocation & leaks」。你可以在xcode中長按「run」命令,選擇「 profile 」來啟動這兩個工具。如下所示:
使用allocation工具可以監控應用的記憶體使用,使用leaks工具可以觀察記憶體的洩漏情況。 此外還可用一些**獲取遊戲記憶體使用的其他資訊,如下所示:
1
cctexturecache::sharedtexturecache()->dumpcachedtextureinfo();
呼叫這個**後,遊戲便會在debug模式執行,這時你會在xcode控制台視窗看到一些格式工整的日誌資訊。
1
2
3
cocos2d: cocos2d:
"cc_fps_images"
rc=5 id=3 256 x 32 @ 16 bpp => 16 kb
cocos2d: cocos2d:
"***/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記憶體。
這是乙個通用的優化規則。在優化過程中,應該做一些權衡取捨。因為有時候影象質量和影象記憶體使用是處於兩級的狀態。千萬不要過度優化!
在此將ccos2d-x記憶體優化分為三個等級。每個等級都有不同的說明,策略也有點不一樣。
這是最重要的的優化等級。因為我們要在cocos2d-x引擎頂層編譯遊戲,引擎自身會提供一些優化選項。 在這個等級我們可以進行大部分優化。簡而言之,我們可以優化紋理、音訊、字型及粒子的記憶體使用。
如果你不是乙個opengles及遊戲引擎高手,可以略過這部分。因為cocos2d-x是乙個開源遊戲引擎,如果你在引擎等級中做了什麼優化,請告知我們! 歡迎任何改進和**。
在這個等級中,建議是編寫無記憶體洩露**。遵循cocos2d-x內建的記憶體管理原則,盡量避免記憶體洩露。
一幀一幀載入遊戲資源
減少繪製呼叫,使用「ccspritebatchnode」
載入紋理時按照從大到小的順序
避免高峰記憶體使用
使用載入螢幕預載入遊戲資源
需要時釋放空閒資源
收到記憶體警告後釋放快取資源.
使用紋理打包器優化紋理大小、格式、顏色深度等
使用jpg格式要謹慎!
請使用rgb4444顏色深度16位紋理
請使用npot紋理,不要使用pot紋理
避免載入超大紋理
推薦1024*1024 npot pvr.ccz紋理集,而不要採用raw png紋理
cocos2d 記憶體管理
不要怕,勇敢的邁出第一步,加油!此章介紹cocos2d 中的記憶體管理 1.cocos2d 中的所有node類都繼承於ref,ref中有引用計數的概念,如下 class testref public ref virtual testref new testref 這時class ref 中的 ref...
Cocos 2d效能優化
每次建立乙個新的精靈都會帶來一定消耗,如果把之前刪除的精靈 到快取池,下次建立精靈時重複利用則省去這部分消耗。var sushi cc.sprite.extend reuse function unuse function 判斷cc.pool是否有某個類 cc.pool.hasobject targ...
cocos2d使用問題
最近在使用3.6版本的richtext遇到getcontentsize的時候會是 var richtext new ccui.richtext richtext.ignorecontentadaptwithsize false richtext.setcontentsize cc.size 500,...