cocos2dx 纹理优化

description: 为什么要谈纹理的问题,游戏的画面无时无刻不充斥着图像,通俗意义上一款精致的游戏都有着非常精美的画面,这样往往能给玩家带来更好的游戏体验,这一点也是对于游戏制作者来说所尽力追求的,但是无奈有CPU和GPU的限制,手持设备上的硬件资源就更窘迫一些了,如何处理好图片资源,往往能给游戏提供更大的扩展空间,从画面上给游戏加分。

为什么要谈纹理的问题,游戏的画面无时无刻不充斥着图像,通俗意义上一款精致的游戏都有着非常精美的画面,这样往往能给玩家带来更好的游戏体验,这一点也是对于游戏制作者来说所尽力追求的,但是无奈有CPU和GPU的限制,手持设备上的硬件资源就更窘迫一些了,如何处理好图片资源,往往能给游戏提供更大的扩展空间,从画面上给游戏加分。

就我个人的经历来说,手机上图片资源处理主要是围绕两个点来周旋的,一个是图片占用的内存,图片加载后生成的纹理会存储在GPU中,而纹理的像素格式就决定了在GPU中的内存,占用的内存小来保证了游戏的机型支持,在低端机上也能运行游戏;另一个非常重要的点就是图片的加载速度,速度太慢会导致CPU占用太大,游戏会显得比较卡,这一点非常影响用户体验。对于我们来说需要处理的就是在这两者与游戏画面之间找到自己的平衡点,采用适合自己游戏的图片资源处理方式,下面来慢慢介绍图片部分的基础知识,后面会再更新-x底层是如何加载和处理图片的一些文章,分享自己的一些看法。

像素格式

(以下为texturepacker支持的打包格式)

像素格式 描述
RGBA8888 默认32位真彩色,4 bytes per pixel,8 bits per channel
BGRA8888 32位,4 bytes per pixel,8 bits per channel
RGBA4444 16位色,2 bytes per pixel,4 bits per channel
RGB888 24位真彩色,3 bytes per pixel,8 bits per channel,no transparency
RGB565 16位色,2 bytes per pixel,5 bits for red and blue,6 bits for green,no transparency,人的眼睛对绿色更敏感
RGBA5551 16位色,2 bytes per pixel,5 bits per color channel,1 bit transparency
RGBA5555 20位色,比较特殊的格式,大部分游戏引擎都不支持,3 bytes per pixel,5 bits per channel,not supported on all platforms
PVRTC2 2 bits per pixel,iPhone only,only PVR files,no real-time preview available
PVRTC4 4 bits per pixel,no real-time preview available
PVRTC2_NOALPHA 2 bits per pixel,no real-time preview available
PVRTC4_NOALPHA 4 bits per pixel,no real-time preview available
ALPHA Black and white image of the alpha channel
ALPHA_INTENSITY 16 bit alpha + intensity,PVR export only
ETC1 ETC1 compression (pkm file only)

其他的常见格式

像素格式 描述
A8 8位色,只有8位通道的透明通道,用来做遮罩图
I8 8位色,只存储8位的灰度或强度值,用来做灰度图使用
AI88 16位色,存储透明和灰度双功能的值
S3TC_DXT1 Compressed color texture format.
S3TC_DXT3 3.0新加的,后面研究后再更新
S3TC_DXT5 3.0新加的,后面研究后再更新
ATC_RGB ATC (ATITC) 4 bits/pixel compressed RGB texture format.
ATC_EXPLICIT_ALPHA 3.0新加的,后面再更新
ATC_INTERPOLATED_ALPHA 3.0新加的,后面再更新

纹理格式

1、png

png图片可谓最常见的真彩图片了,png格式有3种,png8,png24,png32,24位png不支持透明。除了PVRTC和ETC1的像素格式外,大部分的像素格式都支持。

格式 支持色彩通道 索引色编辑支持 透明支持
PNG8 256索引色,每索引色24位(1600万色) 支持 支持设定特定索引色为透明色(布尔透明),支持为索引色附加8位透明度(256阶alpha透明)
PNG24 约1600万色 不支持 不支持
PNG32 约1600万色 不支持 支持8位透明度(256阶alpha透明)

2、pvr

pvr纹理格式是针对iOS设备进行了特殊优化的一种格式了,PowerVR显卡可以直接加载,速度快(类似win下的dds图片),而且每像素2或4位的像素格式使得占用内存很小,基本上在iOS平台的pvr图片格式从加载速度和占用内存两点来说都具有很大的优势。

pvr除了支持场景的RGB像素格式意外还支持有损压缩PVRTC,虽然PVRTC和jpg相同是有损压缩,但是PVR纹理不会在内存中解压缩纹理。

PVR特殊的像素格式:PVRTC2,PVRTC4,PVRTC2_NOALPHA,PVRTC4_NOALPHA,这里的没有ALPHA值就是指图片里面没有透明像素,同时更多的色位会用来表示颜色,图片的颜色质量就会高一点。

需要注意的:如果去官网下载PowerVR的SDK来生成pvr格式的纹理有很大的局限,不仅必须是2的幂还必须要是正方形的。

3、etc1

etc1的格式(pkm或ktx扩展名)是opengles2.0均支持的格式,但android机型众多,显卡型号也有很大的差别,我们的游戏出现过在一些山寨机上etc1图片无法正常显示或者崩溃的情况,而且部分显卡不支持NPOT的etc1图片,所以在android上现在不太推荐使用etc1。

下面针对iOS下纹理格式进行加载的测试,时间单位是微秒,测试设备是iPhone5,用的是原生的cocos2dx3.0的引擎(没有进行修改),纹理的像素格式均为RGBA8888,所以在显示效果上相差不多的,实验的结果基本符合多次测试得出的平均情况。

//RGBA8888 & POT
cocos2d: id=test_png.png(809.6KB) |  x: 1024 y: 1024 |  time: 25316  |  32 bpp  |   4096 KB
cocos2d: id=test_jpg.jpg(119.4KB) |  x: 1024 y: 1024 |  time: 54506  |  32 bpp  |   4096 KB
cocos2d: id=test_pvr.pvr(4.1MB) |  x: 1024 y: 1024 |  time: 22931  |  32 bpp  |   4096 KB
cocos2d: id=test_pvrgz.pvr.gz(1MB) |  x: 1024 y: 1024 |  time: 24309  |  32 bpp  |   4096 KB
cocos2d: id=test_pvrccz.pvr.ccz(1MB) |  x: 1024 y: 1024 |  time: 17981  |  32 bpp  |   4096 KB

//RGB565 & POT
cocos2d: id=test_png.png(460.8KB) |  x: 1024 y: 1024 |  time: 28319  |  32 bpp  |   4096 KB
cocos2d: id=test_jpg.jpg(106.4KB) |  x: 1024 y: 1024 |  time: 58430  |  32 bpp  |   4096 KB
cocos2d: id=test_pvr.pvr(2MB) |  x: 1024 y: 1024 |  time: 11914  |  16 bpp  |   2048 KB
cocos2d: id=test_pvrgz.pvr.gz(385.6KB) |  x: 1024 y: 1024 |  time: 15373  |  16 bpp  |   2048 KB
cocos2d: id=test_pvrccz.pvr.ccz(387.3KB) |  x: 1024 y: 1024 |  time: 10642  |  16 bpp  |   2048 KB

//RGB565 & NPOT
cocos2d: id=test_png.png |  x: 504 y: 1157 |  time: 192065  |  32 bpp  |   2277 KB
cocos2d: id=test_jpg.jpg |  x: 504 y: 1157 |  time: 104246  |  32 bpp  |   2277 KB
cocos2d: id=test_pvr.pvr |  x: 504 y: 1157 |  time: 5704  |  16 bpp  |   1138 KB
cocos2d: id=test_pvrgz.pvr.gz |  x: 504 y: 1157 |  time: 23246  |  16 bpp  |   1138 KB
cocos2d: id=test_pvrccz.pvr.ccz |  x: 504 y: 1157 |  time: 253244  |  16 bpp  |   1138 KB

这里默认的-x还是会以RGBA8888的像素格式创建png和jpg的纹理,需要我们手动修改引擎。从测试结果可以看出,pvr基本完胜了其他纹理格式,加载速度快,特别是pvr.ccz,图片大小仅为pvr格式的1/4,而且加载速度还比pvr要快。jpg的加载速度还是要慢很多。.gz和.ccz有个异常情况,NPOT格式纹理加载时间非常长,而对于其他格式纹理,NPOT格式使得加载时间和内存占用上都得到了提升。

持续更新中…

色深:
cocos2dx默认采用32位(RGBA8888)的色深的像素格式来加载纹理,

不考虑纹理压缩,颜色位数少用png8,颜色位数多非透明用jpg,颜色位数多含半透明使用png24,总的思路就是用png8和jpg来减少图片体积大小

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是