Cocos2dx的內存優化

  1加載圖片過程優化

問題:以cocos2dx 2.x爲例,建立精靈CCSprite的過程當中會建立一個CCImage,因此短期會佔用2倍內存,因此應避免連續加載(同一幀內,加載多張圖片)。緩存

解決:一幀加載一個紋理(CCTextureCache的addImage方法),用schedule方法優化

 

2儘可能少使用jpg圖片動畫

問題:建立jpg紋理的過程當中,和普通紋理加載的過程同樣,同時再加一步轉化成png紋理,這裏會額外產生CCImage的內存。因此比png要高不少。根據牛人 的說 法,普通紋理過程當中會產生2倍自身的內存,jpg又因爲多一步轉化,須要3倍自身內存大小的內存。編碼

解決:避免使用,雖然png圖更大,能夠用壓縮圖片來壓縮一下。blog

 

3紋理的管理圖片

問題:內存

1 常見顏色深度編碼:rem

RGBA565 rgb各佔4位,一個像素佔2個byte,5+6+5位來表示顏色值,沒有alpha通道,不能透明。it

RGBA4444 rgba各佔四位,一個像素佔2個byte,io

RGBA8888 rgba各佔8位,一個像素佔4個字節。顯示效果最好。

RGB5A1 15位表示顏色值,1bit表示alpha值,一個像素佔2個byte,只能徹底透明或者徹底不透明。

1024*1024的圖片,採用RGBA8888和採用RGBA565。磁盤佔用大小同樣,可是內存紋理大小,前者4M後者2M!

解決:

一、cocos2dx默認把全部紋理渲染成16bit的,因此最好用16bit的紋理。

二、使用TextPacker打包圖片,使用NPOT(non power of two)紋理。

三、使用PVR格式的紋理。

四、三種可選用的PVR文件格式中,pvr.ccz最適合,生成的文件最小,加載速度要快。消耗內存更少。

五、PVRTC壓縮是有損的,優勢是不用再內存中解壓縮紋理。效果略差,粒子效果中使用它最合適。

六、紋理加載順序:由大到小。

七、最好不要經過移出沒有使用的紋理來縮小內存,

八、分析當前紋理來去除最可能不會使用到的紋理。CCTextureCache::sharedTextureCache()->dumpCachedTextureInfo()打印出當前的紋理佔用狀況 ,計數只有1或者2的當前最不可能被使用。刪除大紋理效果才明顯。執行TextureCache和SpriteFrameCache這兩個地方的刪除操做。 SpriteFrame類建立的時候引用了TextureCache,因此若是不執行後者的刪除,則Texture的紋理仍是大於1的。不能被及時刪除。

九、cocos2dx緩存分爲:紋理緩存,精靈幀緩存,動畫緩存。刪除紋理緩存可能會牽扯到其餘緩存。

十、聲音文件不使用了及時清除

十一、有些紋理只會被當時使用一次,這用的紋理使用事後立刻清除。eg:

CCSprite *pBg = CCSprite::create(sBg);

.....

CCTextureCache::sharedTextureCache()->removeTextureForKey(sBg);

十二、使用Loading層做爲緩衝,清除前面沒用的緩存完了加載新的場景。

 

5聲音文件

解決:立體聲道變單聲道。MP3比特率,Ios上96到128kbps夠用。

相關文章
相關標籤/搜索