在手机游戏中多媒体文件往往是考虑包大小和内存优化的重点。我这里只说下cocos2d-x 2.4的图片处理。
包的大小控制:
第一种: 可以用TexturePacker 打成RGBA4444 +防抖Dithering(AtkinsonAlpha) +.pvr.ccz
1.RGBA4444 为4x4 = 16bit图,1像素占2字节,而RGBA8888,则会占4字节。看起来小一半,但是加上防抖以后,其实不到一半,但是会小。
2.两个防抖算法:AtkinsonAlpha 和FloydsteidbergAlpha ,我用前者更小,而且效果差不过。
3.pvr.ccz 只是图压缩,不影响cocosbuilder的使用,cocostudio没试过。因为plist里面存储的还是png相关的xml文件。
*4.因为cocos2dx会以2的幂次方读入图,所以如果在有限的1024中放入更多的图,可以精细优化下。
5.这种打图方式,注意下9Sprite的效果,我这里只有用9Sprite的效果稍微差点。
*6.iOS Retina 觉得效果不好可以用RGBA 8888
第二种:用TexturePacker打成RGBA8888 + png+pngquant
1. 这种方式比第一种要更小,减少接近50%。
2. 特效图png不建议用pngquant压缩
3. 背景用jpg即可。
运行速度:
cocos2d-x 解析图片的时候统一按照RGBA8888去处理的,所以无论选择第一种还是第二种方式,占内存都是一样的。所谓的运行速度提升,实际上是从加载速度和解析图片期间的内存膨胀大小来说的。pvr图片加载速度要比png和jpg快3-5倍左右(同样1024*1024 argb8888)。
内存膨胀:
png和 jpg图片加载过程内存消耗(1024*1024 RGBA8888 500k的jpg): 读取图片文件(消耗图片大小内存,500k) ->解析jpg数据(cgimage, 4mb)->释放500k的图片内存 ->opengl纹理数据(4mb) ->释放cgimage的4mb内存。 释放cgimage内存的实际是有系统决定的,会很快,但不一定是立即执行。 所以内存会瞬间飙升8.4mb左右,然后减少4.4mb,稳定到4mb左右
pvr.ccz
同为1024 RGBA8888格式,图片到内存消耗4mb(pvr.ccz为1mb左右解压后为4mb) ,苹果手机和部分安卓手机用的是powerVR显卡,所以可以直接将pvr图片交给显卡消耗4mb,然后释放4mb.
所以,追求速度优先就用第一种方式,且膨胀相对小些。可能适合RPG以及追求极致效果的。
追求最小包试试第二种方式,适合棋牌等不需要太多极致效果的。
也可以将第一种和第二种融合下,精确处理纹理。