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, iPhone only, only PVR files, no real-time preview available
PVRTC2_NOALPHA 2 bits per pixel, iPhone only, only PVR files, no real-time preview available
PVRTC4_NOALPHA 4 bits per pixel, iPhone only, only PVR files, 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来减少图片体积大小

时间: 2024-11-15 10:04:59

cocos2dx 纹理优化的相关文章

Cocos2d-x优化中纹理优化

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

转 iOS和android游戏纹理优化和内存优化(cocos2d-x)

iOS和android游戏纹理优化和内存优化(cocos2d-x) (未完成) 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用CGImage,android和windows下是直接调用png库.我测试了下,使用png库直接读取png会比CGImage还要节约1mb左右内存(图片所占内存4mb)但是速度要比CGImage慢一倍.时间和空间如何取舍就看实际情况了.不过最佳的选择似乎是pvr(即使android版本,即使不使用pvrtc4).

Cocos2dx引擎优化(2) ---自定义资源包系统

把游戏中的资源文件(纹理,模型,材质,音乐,配置xml,json,脚本)打包有很多好处,也成为MMO开发的基本常识.对资源进行打包可以带来以下好处: . 增加游戏资源和脚本破解的难度.大多游戏制作公司都不希望自己花高昂代价制作的资料被人全盘爬过去使用,更不忍受逻辑脚本完全暴露在同行的面前. . 自定义的资源包比访问散文件资源有更快的查找和读取速度,消耗更少的系统资源,如文件句柄. . 自定义资源包可以提供更简单可用的文件存取API.加解密和压缩方案. . 一般来说,打包的资源也会比散文件形式的资

cocos2d-x 游戏优化方案

优化的方案: 引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化. 纹理优化: cocos2d-x 底层是OPenGL ES实现的. 对于图案片载入的内存是2的幂次方. 使用的图片是100*128 会被转为128*128. 如此浪费一定的空间. 色深优化:png图片: A8R8G8B8 A1R5G5B5 ARGB4444  有透明效果:jpg图片:RGB888 RGB555    无透明效果. 不影响图片效果的前提下能够使用较低的色深使用. 纹理压缩格式:ios设备使用的是powervr现实芯

转 cocos2dx内存优化 (之二)

一.cocos2dx之如何优化内存使用(高级篇) 本文由qinning199原创,转载请注明:http://www.cocos2dx.net/?p=93 一.内存优化原则 为了优化应用内存,你应该知道是什么消耗了你应用的大部分内存,答案就是Texture(纹理)!它几乎占据了90%的应用内存.那么我们应该尽力去减小我们应用的纹理内存使用,否则我们的应用进程可能会被系统杀死. 为了减少内存警告,这里我们给出两个普遍的关于cocos2dx游戏内存优化的指导原则. 1)了解瓶颈,然后解决掉 什么样的纹

Cocos2dx引擎优化(1) ---音效系统

Cocos2dx提供的音频库位于CocosDenshion中,其接口由SimpleAudioEngine定义,提供了基本的背景音乐和音效播放. SimpleAudioEngine的实现是夸平台的, 在windows平台上由mci相关API实现; 在android平台上透过JNI,调用android sdk 中的AudioPlayer实现;而在IOS平台上由Cocoa sdk里的Core-Audio实现.但SimpleAudioEngine并不适用于大部分游戏情境,它在Android上的实现需要直

cocos2d-x如何优化内存的应用

自身以前也写过cocos2d-x如何优化内存的应用,以及内存不够的情况下怎么样处置惩罚游戏.今天在微博中看到有友好简介了下内存,挺详细的.不晓得是谁写的,我纪录下. 一,IOS与图片内存 在IOS上,图片会被积极缩放到2的N次方大小.例如一张1024*1025的图片,占用的内存与一张1024*2048的图片是一致的.图片占用内存大小的共计的公式是:长*宽*4.何等一张512*512 占用的内存即是 512*512*4 = 1M.其他尺寸以此类推.(ps:IOS上支持的最大尺寸为2048*2048

cocos2d-x 图片纹理优化 资源加载方案

原文地址:http://blog.sina.com.cn/s/blog_64d591e80101me1y.html 文章主要解决了我一直以来疑惑的几个问题 1.到底用不用2的N次幂的图片 2.为什么加载资源的时候,内存会突然飙高 3.内存突然飙高的解决方案 4.如何解决程序在加载资源卡的问题 首先是cocos2d-x官网上的优化建议 一帧一帧载入游戏资源 减少绘制调用,使用"Use CCSpriteBatchNode" 载入纹理时按照从大到小的顺序 避免高峰内存使用 使用载入屏幕预载入

iOS和android游戏纹理优化和内存优化(cocos2d-x)

1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同.ios下面使用 CGImage,android和windows下是直接调用png库.我测试了下,使用png库直接读取png会比CGImage还要节约1mb左右内 存(图片所占内存4mb)但是速度要比CGImage慢一倍.时间和空间如何取舍就看实际情况了.不过最佳的选择似乎是pvr(即使android版本, 即使不使用pvrtc4). 3.一般来说,我们可以直接使用  w * h * bpp得到一张纹理所占的