Cocos2d-x优化中图片优化

在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相提并论。

2.拼图
不知道大家是否有过这样的一个疑问,为什么要把场景中小图片都拼接成一个大图片呢?这个问题我们在使用精灵表的时候简单说了一下,这一节我们详细介绍一下它原因。
如果把多个小图拼接称为一个大图(纹理图或精灵表),可以减少IO操作。并且使用散图每次都要针对一个图,创建精灵添加到纹理缓存,如果很频繁而大量创建,对于CPU和内存的开销很高。而使用大图,则一次性将创建精灵帧缓存,并把它们纹理添加到纹理缓存中,这样会明显地提高效率。
在进行图片拼接的时候,如果能够满足用户保真度情况下,大图越小当然是越好。我们可以通过TexturePacker等纹理拼图工具,设置纹理支持NPOT,这些工具的使用大家可以参考我们的(《Cocos2d-x实战(卷Ⅳ):工具详解》)。
那么什么是NPOT呢?NPOT是“non power of two”的缩写,意思是非2的N次幂。在OpenGL ES1.1时候纹理图片要求是2的N次幂(即,POT),否则纹理无法创建。POT要求下使用纹理工具拼接成的大图,可以会有很多的空白区域。如下图所示,右下角还有一些空白区域,造成了浪费,也会同时增加图片的大小,下图所示的图片大小是2048KB。

POT拼图

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

NPOT拼图

更多内容请关注国内第一本Cocos2d-x 3.2版本图书《Cocos2d-x实战:C++卷》

本书交流讨论网站:http://www.cocoagame.net
更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com

欢迎加入Cocos2d-x技术讨论群:257760386

欢迎关注智捷iOS课堂微信公共平台

时间: 2024-11-08 17:21:39

Cocos2d-x优化中图片优化的相关文章

android开发中图片优化步骤

android开发中图片优化方法 1.图片加载方法,方便用户加载图片 /*** * 加载本地图片 * @param context:主运行函数实例 * @param bitAdress:图片地址,一般指向R下的drawable目录 * @return */ public final Bitmap CreatImage(Context context, int bitAdress) { Bitmap bitmaptemp = null; bitmaptemp = BitmapFactory.dec

Web性能优化:图片优化

程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://blog.cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过一半的流量和时间都用来下载图片.从性能优化的角度看,图片也绝对是优化的热点和重点之一,Google PageSpeed或者Yahoo的14条性能优化规则无不把图片优化作为重要的优化手段,本文覆盖了Web图片优化的方方面面,从基本的图片格式选择.到尚未被

Android APP内存优化之图片优化

网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到.在Android设备内存动不动就上G的情况下,的确没有必要去太在意APP对Android系统内存的消耗,但在实际工作中我做的是教育类的小学APP,APP中的按钮.背景.动画变换基本上全是图片,在2K屏上(分辨率2048*1536)一张背景图片就会占用内存12M,来回切换几次内存占用就会增涨到上百兆,为了在不影响APP的视觉效果的前提下,

Android中图片优化之webp使用

博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 有关图片的优化,通常我们会用到LruCache(使用强引用.强制回收的办法),会用到SoftReference(使用url做key,bitmap做value的方法),会用到根据手机屏幕来缩放图片,会及时回收图片所占用的内存等方法,但说实在的,这些方法治标不治本,图片该多大还多大,从软件上我们基本上能做到处理图片的极限,那么只剩下考虑从硬件来上优化图片,这就讲到

Cocos2d-x优化中纹理优化

1.纹理像素格式纹理优化工作的另一重要的指标是纹理像素格式,能够最大程度满足用户对保真度要求的情况下,选择合适的像素格式,可以大幅提高纹理的处理速度.而且纹理像素格式有与硬件有这密切的关系.下面我们先了解一下纹理像素的格式,主要的格式有:RGBA8888.32位色,它是默认的像素格式,每个通道8位(比特),每个像素4个字节.BGRA8888.32位色,每个通道8位(比特),每个像素4个字节.RGBA4444.16位色,每个通道4位(比特),每个像素2个字节.RGB888.24位色,没有Alpha

android内存优化之图片优化

对图片本身进行操作.尽量不要使用setImageBitmap.setImageResource.BitmapFactory.decodeResource来设置一张大图,因为这些方法在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存.因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDeco

Android优化之图片优化

1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 decode 后,最终都是通过 Java 层的 createBitmap 来完成的,需要消耗更多内存.因此,改用先通过 BitmapFactory.decodeStream 方法,创建出一个 bitmap,再将其设为 ImageView 的 source,decodeStream 最大的秘密在于其直

Web性能优化之图片优化

http://get.jobdeer.com/6513.get 其中APNG和WebP格式出现的较晚,尚未被Web标准所采纳,只有在特定平台或浏览器环境可以预知的情况下加以采用,虽然均可以在不支持的环境中较好的功能降级,但本节暂不讨论这两种格式 http://isux.tencent.com/introduction-of-webp.html 什么是 WebP? WebP(发音 weppy,项目主页),是一种支持有损压缩和无损压缩的图片文件格式,派生自图像编码格式 VP8.根据 Google 的

cocos2d-x3.2中如何优化Cocos2d-X游戏的内存

在游戏项目优化中都会碰到一个问题,如何既能减少内存又能尽量减少包的大小?在实际项目中有些经验分享一下,事实上2D游戏中最占内存的就是图片资源,一张图片使用不同的纹理格式带来的性能差异巨大,下表是我在IOS平台一个小Demo中的测试结果,该Demo的原始内存占用是7M,测试方法是一次性加载5张2048*2048的图片,使用TexturePacker工具生成图片,内存统计使用Instrument工具,加载时间统计用-X引擎提供的CCTime类,单位是微秒. 图片格式               加载