Colourstar Game Coder,dream to reach all over the world

纹理优化浅谈

最近在做一款2D剧情类项目,特点是图片纹理资源特别多,需要在包体大小和运行内存上面特殊做一些优化性的准备工作,这里需要了解一下游戏纹理优化的内容

整理如下内容干货

1.2D游戏,最占资源的无疑是图片纹理

2.关于一张图片的占用大小,可以简单的用w * h * rgb(3) or rgba(4) 来得出,例如一张1024*1024的带有alpha透明通道的图片,

占用的内存大小为102410244 = 4Mb

特殊的,windows对ddr处理的方式有些特殊,一张图片是以其像素的上2的N次幂来决定其占用大小的,比如一张900 * 900的图片,占用大小其实 应该按照10241024来进行计算,极端情况下,比如一张513513的图,也是按照1024*1024进行计算的,这样浪费了很大的空间.而某些引擎也是采取的这种方式, 所以一般制定美术规范的时候,都是按照2的N次幂来进行图片的大小规范制作.

3.合图

合图有很多好处,其中最重要的有两点:

降低2中所说的图片的浪费,两张257100的图,如果不合图的情况下占用两张512512的图片占用内存,而通过合图算法可以轻而易举的合入到一张512*512的图片中,

然后通过描述文件(plist),直接取这一张图片的两块区域,更复杂一些的算法会进行角度翻转即可.

降低渲染批次.提高渲染效率.做过游戏的都知道DP是什么东西,这里不赘述了.

4.cocos加载图片流程

(1).读取图片文件->

(2).解析图片数据,即创建CGImage->

(3).释放图片文件占用的内存->

(4).OPENGL纹理数据创建,这里基本上就是占用的内存->

(5).释放内存.

了解cocos的都知道,cocos的内存管理是通过autorelease pool机制的,本帧创建的内存会在下一帧的时候才释放,所以,有过cocos开发经验的都知道:

<font color=#ff0000>纹理要尽量避免在同一帧创建</font>

否则短时间内会造成内存非常膨胀,极端情况下会导致crash.

5.PVR

PVR是最灵活的纹理文件格式.PVR可以被显卡锁认可,不需要开辟临时内存来进行读取.即便是32位颜色格式的pvr,也会比png更加有效率. 一般情况下建议ios下一定要使用pvr,android下面不能使用pvrtc4,可以使用RGBA4444格式的pvr贴图以兼容所有android手机机型,并且 没有2次方的限制.

性能对比

pvr的生成工具

TexturePacker,最广泛使用的,包括合图,生成pvr一站式

一些优化方案

1.调整颜色深度,我们知道,图片如果采用正常的RGBA格式,那么一个像素点需要占用32位来表示其颜色(R8,G8,B8,A8),而如果压缩成16位颜色,内存占用会降低到

原来的一半,渲染效率也会得到相应的提升,但是这样带来的代价就是图片纹理会失真,质量会有损失.

一些常用的16位颜色格式包括:

RGBA4444,   精细度最差,图片质量失真最为严重的一种
RGB555A1,   透明通道占1位,即alpha要么是1要么是0,当然现在也有方式变相的支持这种格式的更改alpha
RGB565,     不带透明通道,这种方式是16位中最大程度上保留原图精细度的一种方式.比较适合背景图片和一些矩形的用户控件.

2.使用NPOT纹理,即非2幂格式的纹理.不过如果使用合图的方式方法比较正确,这个优化带来的效果就不是特别的明显了.

3.预先加载所有的纹理,可以在游戏开始Loading的时候将所有纹理都加载好,这样游戏后面会非常流畅,也比较容易帮助排查内存问题.

关于纹理在手持平台的对比区别

cocos纹理优化的一些方式

android和ios优化纹理

[很好的压缩png的工具->pngquant] (https://pngquant.org)