在2D游戏中图片无疑是最为重要的资源文件,它会被载入到内存中转换为纹理,由GPU贴在精灵之上渲染出来。它能够优化的方面非常多。包含:图片格式、拼图和纹理格式等,以下我们从这几个方面介绍一下图片和纹理的优化。

1.选择图片格式

要回答这个问题。我们须要先了解一下眼下在移动平台所使用的图片文件格式。以及这些图片格式Cocos2d-x是否支持。图片格式有非常多,可是在移动平台主要推荐使用的PNG,JPG也能够考虑。而其他的文件格式最好转化成为PNG格式。我们先了解一下它们的特点。

1、PNG文件

PNG文件格式设计目的是替代GIF和TIFF文件格式,是一种位图存储格式。PNG是採用无损压缩,能够有Alpha通道数据支持透明,但不支持动画。PNG能够保存高保真的较复杂的图像。可是文件比較大。

PNG格式具体又分为:PNG8和PNG24,后面的数字则是代表这样的PNG格式最多能够索引和存储的颜色值。

2、JPG

JPG全名是JPEG。JPG图片以 24 位颜色存储单个位图图形。JPG是与平台无关的格式,支持最高级别的压缩,压缩比率能够高达 100:1,这样的压缩是以牺牲图像质量为代价的。换取更小文件大小。JPG不支持透明。JPG比較支持摄影图像或写实图像作品,这是由于它们颜色比較丰富。而对于所含颜色非常少、具有大块颜色相近的区域或亮度差异十分明显的较简单的图片,JPG就不太适合了。



那么我们选择JPG还是PNG呢?非常多人觉得JPG文件比較小,PNG文件比較大,载入到内存纹理。JPG占有更少的内存。这样的观点是错误的!纹理与图片是不同的两个概念,假设纹理是野营帐篷话。那么图片格式是收纳折叠后的帐篷袋子。装有帐篷的袋子大小,不能代表帐篷搭起来后的大小。特别是在Cocos2d-x平台JPG载入后被转化为PNG格式。然后再转换为纹理,保存在内存中。这样无形中添加了对JPG文件解码的时间,因此不管JPG在其他平台表现的多么不俗,可是在移动平台下一定它无法与PNG相提并论。




Cocos2d-x优化中图片优化_c++








2.拼图

不知道大家是否有过这样的一个疑问,为什么要把场景中小图片都拼接成一个大图片呢?这个问题我们在使用精灵表的时候简单说了一下,这一节我们具体介绍一下它原因。

假设把多个小图拼接称为一个大图(纹理图或精灵表),能够降低IO操作。而且使用散图每次都要针对一个图,创建精灵加入到纹理缓存。假设非常频繁而大量创建。对于CPU和内存的开销非常高。而使用大图。则一次性将创建精灵帧缓存,并把它们纹理加入到纹理缓存中,这样会明显地提高效率。

在进行图片拼接的时候,假设能够满足用户保真度情况下,大图越小当然是越好。我们能够通过TexturePacker等纹理拼图工具,设置纹理支持NPOT,这些工具的使用大家能够參考我们的(《Cocos2d-x实战(卷Ⅳ):工具具体解释》)。

那么什么是NPOT呢?NPOT是“non power of two”的缩写,意思是非2的N次幂。在OpenGL ES1.1时候纹理图片要求是2的N次幂(即,POT)。否则纹理无法创建。POT要求下使用纹理工具拼接成的大图。能够会有非常多的空白区域。例如以下图所看到的,右下角另一些空白区域,造成了浪费,也会同一时候添加图片的大小。下图所看到的的图片大小是2048KB。


Cocos2d-x优化中图片优化_缓存_02


POT拼图

OpenGL ES2.0后支持了NPOT。我们不须要为图片是否为2的N次幂而苦恼,如图所看到的,是採用NPOT拼图。整个图片基本上没有大的空白区域。能充分地利用了图片空间。20-24所看到的的图片大小是1822KB,节省了200KB,200KB已经非常了不起了。



Cocos2d-x优化中图片优化_图片格式_03


NPOT拼图