内存优化技巧

1、小图合大图 最好是一个场景一个大图(小图合大图用的好是可以省内存的——opengl2^n机制 并且还可以提高渲染效率所谓批量渲染 但如果场景为了大图里的一个小图而去加载整个大图 就有点。。。)
非重复性图片不建议使用CCTexureCache来缓存纹理.直接用CCTexture2D创建纹理. 

2、对色彩要求不高的图片可以一律采用RGBA4444格式载入
cocos2dx 内部会将图片转换为图片的像素格式,并向OpenGL分配纹理需要的空间.
//分配空间大小的规则是
RGBA8888  ——  一个像素点 4字节(1字节byte=8位bit) 一个1024*1024像素图大小 = 4* 10^6 

RGBA4444  ——  减半

以上仅仅是缓存纹理大小 加上渲染要*2

pvr.ccz格式(它是专门为cocos2d和TP设计的。在TP里面,这是它生成的最小的pvr文件。而且pvr.ccz格式比其它任何文件格式的加载速度都要快。)等

16-bit纹理——cocos2d默认的纹理像素格式是32位颜色深度 Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGBA8888);
   enum class PixelFormat
    {
        //! auto detect the type
        AUTO,
        //! 32-bit texture: BGRA8888
        BGRA8888,
        //! 32-bit texture: RGBA8888
        RGBA8888,
        //! 24-bit texture: RGBA888
        RGB888,
        //! 16-bit texture without Alpha channel
        RGB565,
        //! 8-bit textures used as masks
        A8,
        //! 8-bit intensity texture
        I8,
        //! 16-bit textures used as masks
        AI88,
        //! 16-bit textures: RGBA4444
        RGBA4444,
        //! 16-bit textures: RGB5A1
        RGB5A1,
        //! 4-bit PVRTC-compressed texture: PVRTC4
        PVRTC4,
        //! 4-bit PVRTC-compressed texture: PVRTC4 (has alpha channel)
        PVRTC4A,
        //! 2-bit PVRTC-compressed texture: PVRTC2
        PVRTC2,
        //! 2-bit PVRTC-compressed texture: PVRTC2 (has alpha channel)
        PVRTC2A,
        //! ETC-compressed texture: ETC
        ETC,
        //! S3TC-compressed texture: S3TC_Dxt1
        S3TC_DXT1,
        //! S3TC-compressed texture: S3TC_Dxt3
        S3TC_DXT3,
        //! S3TC-compressed texture: S3TC_Dxt5
        S3TC_DXT5,
        //! ATITC-compressed texture: ATC_RGB
        ATC_RGB,
        //! ATITC-compressed texture: ATC_EXPLICIT_ALPHA
        ATC_EXPLICIT_ALPHA,
        //! ATITC-compresed texture: ATC_INTERPOLATED_ALPHA
        ATC_INTERPOLATED_ALPHA,
        //! Default texture format: AUTO
        DEFAULT = AUTO,
        
        NONE = -1
    }; 


RGBA8888是默认的格式。
RGB565可以获得最佳颜色质量,因为16位全部用来显示颜色:总共有65536总颜色值。但是,这里有个缺点,除非图片是矩形的,并且没有透明像素。所以RBG565格式比较适合背景图片和一些矩形的用户控件。
RGB5A1格式使用一位颜色来表示alpha通道,因此图片可以拥有透明区域。只是,1位似乎有点不够用,它只能表示32768种可用颜色值。而且图片要么只能全部是透明像素,或者全部是不透明的像素。因为一位的alpha通道的缘故,所以没有中间值。但是你可以使用fade in/out动作来改变纹理的opacity属性。
如果你的图片包含有半透明的区域,那么RBGA4444格式很有用。它允许每一个像素值有127个alpha值,因此透明效率与RGBA8888格式的纹理差别不是很大。但是,由于颜色总量减少至4096,所以,RBGA4444是16位图片格式里面颜色质量最差的。
现在,你可以得到16位纹理的不足之处了:它由于颜色总量的减少,有一些图片显示起来可能会失真,而且可能会产生“梯度”。
  

既然代码里可以设置图片格式 那资源里德图片格式意义? 
首先,纹理像素格式的改变会影响后面加载的所有纹理。因此,如果你想后面加载纹理使用不同的像素格式的话,必须再调用此方法,并且重新设置一遍像素格式。
其次,如果你的CCTexture2D设置的像素格式与图片本身的像素格式不匹配的话,就会导致显示严重失真。比如颜色不对,或者透明度不对等等。  设置的格式位数必须控制在图片格式位数范围内

使16位纹理看起来更棒
幸运的是,我们有TexturePacker.(后面简称TP)
TP有一个特性叫做“抖动”,它可以使得原本由于颜色数量减少而产生的失真问题得到改善。(TP里面有很多抖动算法,关于这些算法,读者可以参考我翻译的另一篇文章)。
特别是在拥有Retina显示的像素密度下,你几乎看不出16位与32位的纹理之间的显示差别。当然,前提是你需要采用“抖动”算法。

3、不要出现2^n + 一个很小的值 这种尺寸 优化一下图片尺寸


4、场景onenter 加载所需资源 onexit 删除所有资源


cocos2d有许多缓存类,比如纹理缓存、精灵帧缓存,动画缓存等。但是,如果你想清理内存的话,精灵帧缓存和动画缓存对内存的占有是非常少的,可以说是极少的。主要内存消耗在纹理缓存。

SpriteFrameCache使用了CCTextureCache,将图片添加到了纹理缓存中  CCSpriteFrameCache 的removeSpriteFramesFromFile 并无法实现把资源(纹理缓存)从缓存释放 仅仅是纹理引用-1 如果你想从内存中移除一个纹理,你也必须移除与之相关的精灵帧(因为精灵帧会retain纹理)   

纹理缓存是将纹理缓存起来方便之后的绘制工作。每一个缓存的图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中的,不用在每一次绘制的时候都发送给GPU。

Cocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理。
当这个精灵调用CCTextureCache 或 CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite。

5、请使用MP3格式的声音文件。因为使用没有压缩的声音文件既浪费内存又占用程序大小。当你加载完一些游戏音效时,在不需要的时候,记得要卸载掉。


6、pngyu

Pngyu use pngquant as a compression engine.

pngquant 是一个用来压缩 PNG 图像的命令行脚本和 C 库原理是减少每个像素的大小(颜色位数减少 ->2)使用算法 使肉眼看不出失真

经过转换能显著缩小图片体积 (通常压缩幅度高达 70%) 并且能保留 完整的 alpha 透明度。转换生成的图片可以兼容所有浏览器, 并且 在 IE6 中比 24-bit 的 PNG 图片有 更好的表现


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值