1. 程式人生 > >cocos2dx記憶體優化 ------圖片篇

cocos2dx記憶體優化 ------圖片篇

在這裡總結一下我這一週以來所瞭解的和糾結了很長時間的cocos2dx圖片素材的優化(基於結果,做了很多測試後的分析,底層的東西我也不是很懂),我所使用的版本是3.6:

非常具有啟發意義的一篇文章,來自外國的大神,下面先供上鍊接以及

一、圖片格式

 ***遊戲中一律採用.pvr.ccz格式的打包。***
     .pvr.ccz格式是cocos2dx引擎直接認可的格式,載入時相比.png格式用時少、載入時消耗記憶體也少(png圖片載入時需要消耗兩倍的記憶體,這是由於cocos2dx的記憶體管理所導致的,具體原因可以自己上網查詢。)。
     我們大多數圖片採用RGBA4444的圖片。相比RGBA8888的圖片,記憶體能節省一半,但是同時也會導致圖片失真,這裡我們用TexturePacker中的抖動演算法可以進行改善,但是仍然會有一些圖片會失真(比如煉丹爐中的爐子),所以需要人工辨認,將這些圖片用RGBA8888的格式重新打包。
    我們打包時採用NPOT格式的圖片,NPOT:不是2的冪。這樣可以節省圖片空間,佔用記憶體少。當前OpenGL版本是支援NPOT的。

二、圖片打包

***打包軟體:TexturePacker(必須用破解版或者正版,試用版不行),最好支援正版!!***
步驟:①匯入圖片
     ②選擇格式.pvr.ccz
     ③選擇顏色通道RGBA4444
     ④選擇抖動演算法FloydSteinbergAlpha
     ⑤採用NPOT格式,選擇AnySize
注意:圖片如果太大,比如4000*4000,要分開來壓縮!原因兩點:
    1、圖片太大,有些裝置不支援
    2、經測試,將大圖分開來,可以減少記憶體消耗
    一般來說1000*1000以下最好,1000-2000之間可接受

三、程式碼設定

***程式碼中不需要做出額外設定,下面具體分析可以不看。***
     不要看有些教程中說要設定成:RGBA4444。我們仍然保持引擎的預設設定RGAB8888,因為非常妙的一點就是引擎並不支援將RGBA4444轉化為GRBA8888,所以說它並不會將我們的16點陣圖片轉化為32位,它仍然會按照4444的格式來使用!而且我們有些圖片用RGBA4444格式會失真,這樣我們仍可使用8888的圖片。
     當我們使用預設設定載入RGBA4444格式時,在非同步載入的時候會看到這樣的提示:“unsupport convert for format 8 to format 2”,不用去管!
相反的,如果設定成RGBA4444,引擎是支援將RGBA8888圖片轉化為4444的,這樣我們使用8888的圖片就會失真了。

設定程式碼:Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGBA8888);

四、圖片資源的載入與釋放

***我認為當所有資源小於70M時,可以全部進行預載入。***
    在遊戲中我將一些立刻要顯示的圖片提前進行了載入,而一些對話方塊的資源只有當用的時候才進行載入。
    每次退出場景,在onExit呼叫removeSpriteFramFormFile方法,制定釋放我認為需要釋放的資源。
    每次進入新的場景,在onEnter函式處呼叫removeUnusedTextures()。
    對於那些對話方塊,在init方法處預載入資源,onExit方法釋放。

五、其他的事

   載入資源的時候越懶越好,不到顯示出來的時候不載入,當然這需要個人權衡,圖片資源太大的話還是先載入吧。
   使用png資源時,儘量不要在一個函式內載入所有的資源,逐幀載入最好。這是因為cocos2dx採用的記憶體管理方式,導致載入png資源會佔用兩倍的記憶體。有部落格說,按資源從大到小的方式載入也有助於節省記憶體。