图片动画美术资源的优化-可大量的优化IO/内存/CPU/GPU性能
2015-03-14 10:52
190 查看
一、图片贴图纹理的优化压缩
参考自:http://www.58player.com/blog-2533-66464.html1. 图片分类合并: 成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索引获取纹理、精灵或动画。
四、***对称/九宫格/碎片图片,利用CPU计算减少资源
对称的图片可以翻转得到另一半得到,九宫格图片可以放大得到。对于大图片,不能使用九宫格,但是部分可以复用,那么可以对那部分进行九宫格,其它图片进行拼接得到整个大图。
五、***批量渲染的单个贴图,利用GPU的批量渲染提高GPU性能
1. 批量渲染:使用CCSpriteBatchNode和CCParticleBatchNode精灵批节点类和粒子批节点类。批次处理
使用CCSpriteBatchNode,准备好Sprite的坐标信息后,进行一次性渲染。
传统渲染处理是这样的:不同的切换纹理,不同地加载和渲染。而批次处理是一次加载完所有纹理,然后一次渲染,这样效率就提高了。
相关文章推荐
- Android Bitmap大量使用不产生OOM之“加载大图片资源优化”
- Android Bitmap大量使用不产生OOM之“加载大图片资源优化”
- Android Listview 加载图片优化--本地加载大量图片,解决滑动卡顿现象(滑动停止加载图片)
- 图片及动画对B2B行业网站搜索引擎优化的影响
- Unity3d开发中美术资源的优化
- 大量图片优化
- Android资源图片内存占用及优化
- Android ListView 性能优化-----(异步加载图片资源)
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- Android应用优化(3)APK资源图片优化
- Android资源图片内存占用及优化
- web资源优化之图片加载的时机
- 【直接下载】大量精品儿童教育资源 英语 分级教材 动画电影 音频故事 绘本 自然拼音 读经诵读 无损音乐
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
- Android资源图片内存占用及优化
- Android资源图片内存占用及优化
- iOS开发之加载、滑动翻阅大量图片优化解决方案
- 使用开源imageLoader优化listview加载大量本地图片的demo
- Unity3d开发中美术资源的优化