本文是原创文章,如需转载,请注明文章出处

本次测试使用的cocos2d-x版本是3.9,测试环境是XCode7自带的iphone5

一、JPG格式与PVR.CCZ格式对比

1.占用空间对比

a)不透明图片

 

原始大小(KB)

PNG(KB)

JPG(KB)

PVR.CCZ(KB)

A

3408

1428

203

725

B

3408

1300

175

677

C

3408

785

107

382

D

3408

656

126

384

随便找了4张1136*768的不透明图片为样本,像素格式使用RGBA8888,则原始大小为1136*768*32/8=3408KB。
以A图为例:

如果存储为PNG格式,像素格式是RGBA8888,PNG格式是无损压缩,大小为1428KB;

如果存储为JPG格式,我使用PS6以高质量压缩后,大小为203KB,肉眼看起来完全跟PNG格式一样;

如果存储为PVR.CCZ格式,对于不需要透明度的图片,像素格式用RGB565,大小为725KB,肉眼看起来完全跟PNG格式一样。

结论:

对于不透明图片,JPG格式图片体积大约是PNG格式的1/7。PVR.CCZ采用RGB565像素格式的情况下,图片质量基本无损,体积大约是PNG格式的1/2。

PVR.CCZ格式图片大小 ≈ JPG格式图片大小的3.5倍

b)透明图片

 

原始大小(KB)

PNG(KB)

JPG(KB)

PVR.CCZ(KB)

E

1361

427

-

608

F

1725

576

-

771

G

1556

654

-

884

H

1556

755

-

1037

随便找了4张透明图片为样本,像素格式使用RGBA8888。
以H图为例,这是一张分辨率为942*423的透明图片,假设像素格式是RGBA8888,则每个像素大小为32bits,如果不使用压缩,大小为942*423*32/8=1556KB:

如果存储为PNG格式,像素格式是RGBA8888,PNG格式是无损压缩,大小为755KB;

如果存储为JPG格式,JPG格式会丢失透明度,不可取。

如果存储为PVR.CCZ格式,像素格式用RGBA8888,大小为1037KB。

结论:

对于透明图片,由于JPG格式不支持半透明,所以只能选择PVR.CCZ或者PNG格式,在都采用RGBA8888像素格式的情况下,PVR.CCZ格式比PNG格式体积稍大。

PVR.CCZ格式图片大小 ≈ PNG格式图片大小的1.35倍

2.运行时加载效率对比

 

JPG(KB)

加载耗时(ms)

PVR.CCZ(KB)

加载耗时(ms)

A

203

42

725

13

B

175

42

677

13

C

107

38

382

10

D

126

38

384

10

根据表中数据得出结论:

1136*768的图片,在FPS24的帧率下,JPG格式需要42ms,相当于1帧的时间了,而PVR.CCZ只需要1/3的时间。从加载效率来看,PVR.CCZ格式显然要快得多。

3.运行时占用内存对比

a)JPG

以1136*768的A图片为例,原始大小为3.33MB。

加载JPG格式图片时:

1)读取JPG图片数据,占用203KB。

2)经过CCImage::initWithJpgData()生成CCImage对象,像素格式是RGB888,占用3.33*3/4=2.50MB。

3)释放JPG图片数据。

4)通过CCImage对象生成临时数据解析像素数据,占用3.33MB,并存为Texture2D对象,占用3.33MB,然后释放临时数据。

5)释放CCImage对象。

整个加载过程占用:本身JPG图片大小(203KB)+ CCImage(2.50MB)+解析像素数据(3.33MB)+ 纹理数据(3.33MB)≈ 将近3倍原始大小。最终Texture2D对象常驻内存,占用3.33MB。

b)PVR.CCZ

以1136*768的A图片为例,像素格式使用RGB565,原始大小为1.66MB。

加载PVR.CCZ格式图片时:

1)读取PVR.CCZ图片数据,占用725KB。

2)解压PVR.CCZ,生成PVR数据,占用1.66MB(1136*768*16/8)。

3)释放PVR.CCZ数据。

4)通过PVR数据生成CCImage对象,占用1.66MB。

5)释放PVR数据。

6)通过CCImage数据生成Texture2D对象,占用1.66MB。

7)释放CCImage对象。

整个加载过程占用:本身图片大小(725KB)+ PVR(1.66MB)+ CCImage(1.66MB)+ Texture2D(1.66MB)≈ 将近3.5倍原始大小。最终Texture2D对象常驻内存,占用1.66MB。

结论:

JPG格式图片大小是PVR.CCZ格式的30%左右。

JPG格式图片加载速度慢,是加载PVR.CCZ格式的3倍时间以上。

加载JPG格式图片需要将近3倍图片原始大小,加载PVR.CCZ格式图片需要3.5倍图片原始大小,这方面JPG略胜。

根据以上三方面对比得出结论:

1.对于半透明图片,由于JPG不支持半透明,只能选择PVR.CCZ。推荐使用RGBA8888或RGBA4444的PVR.CCZ格式。

2.对于不透明图片,JPG与PVR.CCZ各有优劣,如果是大的背景图,由于JPG加载速度慢可能导致卡顿,建议用RGB565或RGBA5551的PVR.CCZ格式;如果是小的icon之类,在不影响运行效率的情况下,推荐使用JPG格式。

二、图片资源组合在一张图上的性能影响

1.占用空间对比

以分辨率为106*134的74张RGBA4444图片为例,

组合在一张图片的大小(925KB)

分散成74张图片的大小(888KB)

组合在一张图片的大小≈分散成74张图片的大小的1.05倍

结论:

从占用空间对比来看,组合在一张图片上的体积略大一点点,如果是很多不规则尺寸的图组合在一张图上,这个体积差距会更大一些。

2.运行时加载效率对比

依然以分辨率为106*134的74张RGBA4444图片为例,

组合在一张图片时,首次加载整张图片需要13ms,之后每次取缓存即可。分别加载74张图,时间在1ms之内。

分散成74张图片时,分别加载74张图,一共需要132ms。

结论:

从运行时加载效率对比来看,当总加载数量不超过7张时,单张单张加载更快一点,当总加载数量超过7张时,组合在一张图片上会快很多。

3.运行时占用内存对比

依然以分辨率为106*134的74张RGBA4444图片为例,

组合在一张图片时,加载后纹理常驻内存需要2008(宽)*530(高)*16/8=2.03MB。

分散成74张图片时,每次加载后纹理才会常驻,每张纹理占106*134*16/8=28KB。

结论:

从运行时占用内存对比来看,加载整张图片会使其一直常驻内存占用空间,分散加载会在加载单张图片后才常驻内存。

根据以上三方面对比得出结论:

1.对于英雄头像这种游戏中大量且经常用到的资源,推荐组合在一张图片上,因为只需要首次加载后,之后就算要大量加载也毫无压力,至于内存,就算是单张单张加载最后也要常驻内存的,影响不大。

2.对于背景图这种很少用到且不可能大量加载的资源,应该分成单张图片,避免内存浪费。

cocos2d-x 图片性能测试的更多相关文章

  1. Cocos2D中图片加-hd后缀的说明

    你可能注意到实际上游戏中的sprite都有2张图片,它都对应该精灵,并包含在资源包中(resource pack): player.png(27x40 pixels)和player-hd.png(do ...

  2. Cocos2d 中的Sprite大小调整问题

    以前用UIImageView,比如  UIImageView *view = [[UIImageViewalloc] initWithImage:[UIImageimageNamed:@"b ...

  3. 移动性能测试 | 持续集成中的 Android 稳定性测试

    前言 谈到Android稳定测试,大多数会联想到使用monkey工具来做测试.google官方提供了monkey工具,可以很快速点击被应用,之前我有一篇帖子提到了monkey工具的使用,详见: htt ...

  4. [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面

    cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...

  5. [cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类

    用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 # ...

  6. cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能

    cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...

  7. cocos2d(背景图片循环滚动)

    背景图片循环滚动 使用action 实现的: 主要有两个背景图片交替循环滚动:我选的两个背景图片的宽度都是1024的 ,所以定义了#define BGIMG_WIDTH 1024 代码如下: 在Hel ...

  8. COCOS2D中对精灵的操作、对图片的各种操作

    内容简要: 1.初始化 2.创建无图的精灵 3.设置精灵贴图大小  4.添加入层中 5.对精灵进行缩放  6.对精灵宽或高进行缩放  7.旋转精灵 8.设置精灵透明度  9.精灵的镜像反转  10.设 ...

  9. cocos2d 图片模糊

    CCSprite texture setAliasTexParameters -->opengl 的功能 将图片柔化

随机推荐

  1. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名及手工脚本创建oracle数据库

    数据库名.实例名.数据库域名.全局数据库名.服务名 , 这是几个令很多初学者容易混淆的概念.相信很多初学者都与我一样被标题上这些个概念搞得一头雾水.我们现在就来把它们弄个明白. 一.数据库名 什么是数 ...

  2. SQL Server 常用高级语法笔记

    自从用了EF后很少写sql和存储过程了,今天需要写个比较复杂的报告,翻出了之前的笔记做参考,感觉这个笔记还是很有用的,因此发出来和园友分享. 1.case...end (具体的值)case后面有值,相 ...

  3. Good Bye 2015 D. New Year and Ancient Prophecy

    D. New Year and Ancient Prophecy time limit per test 2.5 seconds memory limit per test 512 megabytes ...

  4. 常见UI布局之1-2-1单列变宽布局

    扩展前一篇“上中下三栏布局”,中间栏划分成两列,一列宽度固定,一列宽度随浏览器窗口宽度的变化而变化.固定宽度列定义为#side,可分为左侧布局和右侧布局,分别实现如下: 1-2-1左侧固定宽度布局 & ...

  5. oracle迁移postgres之-oracle_fdw

    1. 安装oracle_fdw 在编译安装前,需要设置postgres的环境变量,如在.bash_profile中增加: export ORACLE_HOME=/u01/app/oracle expo ...

  6. Hibernate的批量插入(&&JDBC)

    来自: http://blog.csdn.net/an_2016/article/details/51759890 一.批量插入(两种方式) 1,通过hibernate缓存 如果这样写代码进行批量插入 ...

  7. Nginx的安装配置

    1.安装PCRE库 $ cd /usr/local/ $ https://sourceforge.net/projects/pcre/files/pcre/8.36/ $ tar -zxvf pcre ...

  8. android 弹出对话框之四周变暗处理方式

    设置对话框的dim值即可 WindowManager.LayoutParams lp=popDlg.getWindow().getAttributes(); lp.dimAmount = 0.0f; ...

  9. sql中批量删除带有外键的所有表

    1首先删除所有的外检约束 --删除所有外键约束 DECLARE c1 cursor forselect 'alter table ['+ object_name(parent_obj) + '] dr ...

  10. spring-listener&spring-task注解版本

    1.spring-listener: a) import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextLi ...