图片动画美术资源的优化-可大量的优化IO/内存/CPU/GPU性能

一、图片贴图纹理的优化压缩

参考自: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 CCSpriteFrameCacheCCAnimationCache;都可以为其添加一个key,后面通过key索引获取纹理、精灵或动画。


四、制作对称/九宫格/碎片图片,利用CPU计算减少资源

对称的图片可以翻转得到另一半得到,九宫格图片可以放大得到。对于大图片,不能使用九宫格,但是部分可以复用,那么可以对那部分进行九宫格,其它图片进行拼接得到整个大图。

五、制作批量渲染的单个贴图,利用GPU的批量渲染提高GPU性能

1.      批量渲染:使用CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。

批次处理

使用CCSpriteBatchNode,准备好Sprite的坐标信息后,进行一次性渲染。

传统渲染处理是这样的:不同的切换纹理,不同地加载和渲染。而批次处理是一次加载完所有纹理,然后一次渲染,这样效率就提高了。

你可能感兴趣的:(图片动画美术资源的优化-可大量的优化IO/内存/CPU/GPU性能)