cocos2dx内存优化 ------图片篇

时间:2023-02-07 21:04:26

在这里总结一下我这一周以来所了解的和纠结了很长时间的cocos2dx图片素材的优化(基于结果,做了很多测试后的分析,底层的东西我也不是很懂),我所使用的版本是3.6:

非常具有启发意义的一篇文章,来自外国的大神,下面先供上链接以及

中文翻译链接:http://www.learn-cocos2d.com/2012/11/optimize-memory-usage-bundle-size-cocos2d-app/

翻译:http://www.cnblogs.com/zilongshanren/archive/2012/12/09/2810017.html


一、图片格式

 ***游戏中一律采用.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资源会占用两倍的内存。有博客说,按资源从大到小的方式加载也有助于节省内存。