為優化應用記憶體使用,開發人員首先應該知什麼最耗應用記憶體,答案就是紋理! 紋理幾乎會佔據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引擎頂層編譯遊戲,引擎自身會提供一些優化選項。 在這個等級我們可以進行大部分優化。簡而言之,我們可以優化紋理、音訊、字型及粒子的記憶體使用。
第一: 看紋理優化,為了優化紋理記憶體使用,必須知道什麼因素對紋理記憶體使用的影響最大。主要有3個因素會影響紋理記憶體,即紋理格式(壓縮還是非壓縮)、顏色深度和大小。我們可以使用pvr格式紋理減少記憶體使用。推薦紋理格式為pvr.ccz。紋理使用的每種顏色位數越多,影象質量越好,但是越耗記憶體。所以我們可以使用顏色深度為rgb4444的紋理代替rgb8888,這樣記憶體消耗會降低一半。此外超大的紋理也會導致記憶體相關問題。所以最好使用中等大小的紋理。
需要opengles及遊戲引擎高手
在這個等級中,建議是編寫無記憶體洩露**。遵循cocos2d-x內建的記憶體管理原則,盡量避免記憶體洩露。
(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紋理
****:
記憶體管理 3
記憶體對映檔案例項 dll 動態庫的好處在前面說過,可以動態呼叫,節約記憶體空間,以及動態的改變dll而不需要重新編譯我們呼叫dll 的客戶端程式。動態的庫的呼叫有2中方式,一種是顯式的一種隱式的,這裡我只考慮顯式的,隱式的呼叫跟靜態庫的呼叫類似,需要提供宣告檔案和庫檔案 lib 所以我們在隱式呼叫...
3記憶體管理
3.2.2 交換技術 3.2.3 空閒記憶體管理 3.3 虛擬記憶體 帕金森定律 不管儲存器多大,程式都可填滿它 這章討論os怎樣對儲存器建立抽象模型 os的工作是將這個儲存體系抽象為乙個有用的模型並管理這個抽象模型。至於永久性儲存器 磁碟 的抽象和管理,是下章主題 從最簡單的管理方案討論,逐步深入...
七 記憶體優化(3)使用DMV
一 sys.dm os memory clerks 1.查詢dmv sys.dm os memory clerks返回sql server例項中當前處於活動狀態的全部記憶體clerk的集合。跟蹤這個dmv,可以看到記憶體是如何被sql server消耗。select type,sum virtual...