background image

这里还有一点需要说明,一般我们处理

windows 下的 dds 纹理的时候,都习惯将其按 2 的

整次幂对其,虽然图片内容只有

900*900,但是图片大小却是 1024*1024。那我们读取这个

图片所消耗的内存就是

4mb,按 2 的整次幂对其是有助于提高运行效率的,但是不是非常

必须的。

ios 和 android 的设备都支持非 2 的整次幂的纹理。所以如果是 png 图片,那么它该

多大就多大。此时消耗的内存就只有

900*900*4=3mb。

9、不要过于迷信所谓的去除 alpha 通道以节约内存。这个还要实际分析下具体结果。 我测试
过(分别用

cocos2d-x 和鬼火 3d 引擎),rgba8888 和 rgb888 格式的 png 图片显示所消耗的

内存是一样的。

24 位图片虽然读取的时候开辟的内存只有 3mb(1024*1024*3,注意如果是

CGImage 读取的话,那这个值就是 4mb),但是 glTexImage2D 提交给显卡后依然会增

4mb 内存。可能跟显卡的数据对齐有关。

这里我测试还有一个诡异的地方,如果是用

pvr 的 npot 图片的话,rgb888 要比 rgba8888 所

消耗的内存要小,但是

pot 图片两者又是一样的(png 图片两种情况都是一样的)。可能是

powervr 显卡有特殊处理。
10、rgb565 和 rgb5551 的图片所消耗的内存是 rgba8888 的一半,如果没有透明渐变的话,视
觉上也看不出什么区别。一些大的背景图可以优先选择这种格式。
11、pvr 图片加载速度要比 png 和 jpg 快 3~5 倍(同样 1024*1024 argb8888),png 消耗的时
间可能是

700ms 左右,但是 pvr 只需要 100ms 左右。如果是 pvr.ccz 压缩下,消耗的时间是

200ms 左右。可见 pvr 在加载速度上还是有非常大的优势的。这个应该是因为 png 和 jpg 需要
把图片数据还原为

rgba,但是 pvr 可以直接把图片数据传递给显卡。pvrtc4 的图片是可以被

powervr 显卡直接支持的。

总结下:
1、最终决定图片占用内存的是它的像素格式和大小,与其扩展名无关。png8 png32 jpg pvr
只要其像素格式都是

argb8888,那么最终图片占用的内存是一样的。

2、如果不是 pvrtc4 的格式,那么不要扩展成 2 的整次幂,因为图片越小,占用内存越小
3、单单去除透明通道不会减少图片所消耗的内存,png 和 jpg 图片也无法减少图片体积,所
以不推荐

rgb888 的格式。替代选择 rgb565 和 rgb5551。

5、小心加载图片时临时开辟的纹理数据造成的内存飙高,可以考虑加入内存池,及时的开
辟和释放缓冲区。
6、如果是为了减少图片体积可以选择:1、jpg--压缩比最高,质量较好,但是不支持半透明

 

2、png8--同样图片会比 jpg 略大一些,使用 ImageAlpha 进行转换,视觉上几乎看不出差别。

 

这两种图片格式都可以极大的减少图片体积(减少

70%~80%),但是无助于减少内存

7、如果是为了减少内存可以选择:1、没有透明色的图片统一转换为 rgb565 格式,这个时候
无法使用

png8 了,所以 png 和 pvr.ccz 图片大小几乎相同,pvr.ccz 速度更快,所以推荐

pvr.ccz 的 rgb565 格式 2、如果透明色仅仅是进行关键色标注,而没有渐变混合,那么推荐
rgb5551 (r5_a1)的 pvr.ccz 格式
8、可以考虑写个打包系统,统一把资源文件打包,而不是单个文件用 pvr.ccz 进行 zip 压缩,
这样可以获得更高的效率。(比如我封装了下暴雪的

mpq 打包,其读取速度与本地文件读

取速度相当,这样就可以获得最佳的读取效率)