参考自:http://www.58player.com/blog-2533-66464.html
1. 图片分类合并: 成plist大图文件减少内存,常驻的plist和公共的plist可以进入游戏就加载;特定界面的plist可以打开时候加载,如果太大卡顿那么进入场景时候加载,离开场景时候释放。因为Opengl是以2的整数幂申请图片纹理内存的,所以用plist可有效节省内存。
2. 图片压缩: 质量要求不高的RGBA8888,压缩为RGBA4444加上texturePacket的插值算法; 不要求Alpha通道的用TP去掉alpha通道,采用RGB565格式,图片大小也会减半。
3. 图片格式:android一般用png格式, ios用pvr格式,PC用tga/dds格式,图片更小,加载速度更快。不要是个jpg格式的图片!
cocos2d里面纹理加载分为两个阶段:1.从图片文件中创建一个UIImage对象。2.以这个创建好的UIImage对象来创建CCTexture2D对象。这意味着,当一个纹理被加载的时候,在短时候内,它会消耗两倍于它本身内存占用的内存大小。
cocos2d-iphone使用JPG纹理的时候有一个问题。因为JPG纹理在加载的时候,会实时地转化为PNG格式的纹理。这意味着cocos2d-iphone加载纹理是非常慢的(这里有演示),而且JPG纹理将消耗三倍于本身内存占用大小的内存。
一个2048*2048大小的纹理会消耗16M的内存。当你加载它的时候,在短时间内,它将消耗32MB内存。现在,如果这个图片是JPG格式,你会看到这个数字会达到48MB,因为额外的UIImage对象的创建。
可以使用CCTexture2D对象的类方法setDefaultAlphaPixelFormat来更改默认的纹理像素格式。
首先,纹理像素格式的改变会影响后面加载的所有纹理。因此,如果你想后面加载纹理使用不同的像素格式的话,必须再调用此方法,并且重新设置一遍像素格式。
4. 图片大小:大图的宽高不必是2的整数幂。
不同设备支持的纹理尺寸不一样,iphone4支持最大的是4096*4096,iphone4s是4096*2048。有的android设备,仅仅限制在1024*1024。拼图的时候要避免把图片拼的太大。为了提高游戏的兼容性,图片的尺寸最好都设置在1024*1024范围内(主流设备都支持)。
5. 特殊图片格式处理:对于png图片,最后一步是用PNGGauntlet工具做一次垃圾数据清除,进一步瘦身。
6. 程序处理:尽量使用九宫格对图片放缩,对称的图片只需要一边,重复的大图只需要小图放大拼接即可(编辑器处理也是类似程序的方式).
也可以用在线更新下载,微端的思想来实现小包。
7.内存飙升问题:加载大量纹理防止内存飙升,可以考虑使用内存池,及时的开辟和释放缓存区。
PVR格式:
使用PvrTexTool生成.
PVRTC2和PVRTC4是两种pvr压缩的图像格式,他们都是pvr文件。这两种图像格式比普通图像有更快的加载速度和更小的内存占用。
PVRTC4: Compressed format, 4 bits per pixel,ok image quality
PVRTC2: Compressed format, 2 bits per pixel,poor image quality
一般pvr格式文件的图像格式有:
RGBA8888: 32-bit texture with alpha channel,best image quality
RGBA4444: 16-bit texture with alpha channel,good image quality
RGB565: 16-bit texture without alphachannel, good image quality but no alpha (transparency)
图像占用内存的公式是:numBytes = width * height *bitsPerPixel / 8
也就是说2048*2048的RGBA8888占用内存16MB,而PVRTC4只占用2MB。
PVR格式实际上就是把ARGB8888转成ARGB1555色深进行保存的。
如果是ios设备的话,可以使用pvr.ccz,pvrtc4格式的图片,这个格式相当于windows下的dds图片,是可以被显卡直接支持的。
pvr也不是万金油。
android设备下虽然可以使用pvr格式,但是不能使用pvrtc4,希望通过pvr像ios设备上一样真正减少游戏内存是不太可行的。
图片压缩解压:
pvr.ccz其实就是pvr图片zip打包下,程序读的时候还是先解压出pvr资源,然后再读取pvr。不过由于压缩下可以极大的减小图片体积,所以虽然多了解压过程也不会有特别多的cpu消耗。
参考:
http://blog.csdn.net/langresser_king/article/details/8426708
1.序列动画较多,用降帧方式来优化。
2.序列动画尽量分割为比较小的动画,方便重用。
3.采用骨骼动画:
以前做人物动画我们常常使用每一帧画一幅图片的逐帧动画方式。使用骨骼动画可以大大降低图片帧的数量,它只需要很少的图量就可以达到几乎相同的动画效果。但需要做比较复杂的编辑工做,对每一个关健帧的骨骼点进行编辑。
骨骼动画的制做流程一般为:
(1).通过设定基础的骨骼点并构建出骨架关系树。将人物按骨架树划分成各个身体部件。
(2).按照划定的身体部件来制做人物或动物图片,当然一般是将整个人物或动物图片进行切图命名图块来取得。
(3).将身体部件图块绑定到相应的骨骼上。
(4).设定关键帧,编辑关键帧上所有骨骼的位置及缩放与旋转变化。
(5).播放动画,使骨骼按照时间进行两个关键帧间的变化插值计算,使用插值后的结果来影响身体部件图块绘制时的顶点位置。
骨骼动画的算法关键是对于骨骼动画编辑器的掌握,希望大家多多研究使用。
参看网友豆奶哥哥的博文:
http://www.cnblogs.com/lovegame/archive/2012/10/15/2722626.html
三、制作plist贴图集文件,利用内存缓存提高IO和内存性能
CCSpriteFrameCache
CCTextureCache
缓存比较耗电量,所以,一般使用完,就会调用remove函数。而且在预加载时要显示进度条,可能会影响用户体验,应该根据情况使用。
预加载:
CCTextureCache、 CCSpriteFrameCache、CCAnimationCache;都可以为其添加一个key,后面通过key索引获取纹理、精灵或动画。
对称的图片可以翻转得到另一半得到,九宫格图片可以放大得到。对于大图片,不能使用九宫格,但是部分可以复用,那么可以对那部分进行九宫格,其它图片进行拼接得到整个大图。
1. 批量渲染:使用CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。
批次处理
使用CCSpriteBatchNode,准备好Sprite的坐标信息后,进行一次性渲染。
传统渲染处理是这样的:不同的切换纹理,不同地加载和渲染。而批次处理是一次加载完所有纹理,然后一次渲染,这样效率就提高了。