cocos2d-x 图片性能测试
本文是原创文章,如需转载,请注明文章出处
本次测试使用的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 图片性能测试的更多相关文章
- Cocos2D中图片加-hd后缀的说明
你可能注意到实际上游戏中的sprite都有2张图片,它都对应该精灵,并包含在资源包中(resource pack): player.png(27x40 pixels)和player-hd.png(do ...
- Cocos2d 中的Sprite大小调整问题
以前用UIImageView,比如 UIImageView *view = [[UIImageViewalloc] initWithImage:[UIImageimageNamed:@"b ...
- 移动性能测试 | 持续集成中的 Android 稳定性测试
前言 谈到Android稳定测试,大多数会联想到使用monkey工具来做测试.google官方提供了monkey工具,可以很快速点击被应用,之前我有一篇帖子提到了monkey工具的使用,详见: htt ...
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...
- [cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类
用CCLabelTTF显示的数字不好看.于是就想到用图片来代理.眼下网上的实现都是把每一个数字做一个CCSprite组合的方式. 可是我想.动态生成纹理的方式.没有就仅仅好自己手动写一个. 头文件 # ...
- cocos2d中如何使用图片纹理图集的加载来实现一个动画的功能
cocos2d中要实现一个动画,一般采用纹理图集的方式,也就是说把几个连续动作的图片挨个显示切换这样就是动画 一: 首先先看下今天要实现的具体的目的,打飞机的时间屏幕上会有一个喷火的小飞机,飞机的尾部 ...
- cocos2d(背景图片循环滚动)
背景图片循环滚动 使用action 实现的: 主要有两个背景图片交替循环滚动:我选的两个背景图片的宽度都是1024的 ,所以定义了#define BGIMG_WIDTH 1024 代码如下: 在Hel ...
- COCOS2D中对精灵的操作、对图片的各种操作
内容简要: 1.初始化 2.创建无图的精灵 3.设置精灵贴图大小 4.添加入层中 5.对精灵进行缩放 6.对精灵宽或高进行缩放 7.旋转精灵 8.设置精灵透明度 9.精灵的镜像反转 10.设 ...
- cocos2d 图片模糊
CCSprite texture setAliasTexParameters -->opengl 的功能 将图片柔化
随机推荐
- JAVA中的异常及处理异常的方法
异常 这是我老师的喜好:就是说一上来就拿一张图给大家看看,过过瘾-_- 这是一张: 异常分类图 来,这里还有一张带中文的常见异常截图!!! 1:先来说说什么是异常吧: 其实就是"阻止当前方法 ...
- 电脑安装Android4.0虚拟机的做法
在开始教程之前,先给大家展示一下成功运行Android 4.0虚拟机的界面,经过笔者测试,体验很流畅,喜欢DIY和对开发感兴趣的朋友们可以猛击下一页,继续浏览教程. 准备工作 在体验前我们首先要下载J ...
- 依赖注入(DI)和Ninject,Ninject
我们所需要的是,在一个类内部,不通过创建对象的实例而能够获得某个实现了公开接口的对象的引用.这种“需要”,就称为DI(依赖注入,Dependency Injection),和所谓的IoC(控制反转,I ...
- win7下matlab2016a配置libsvm
1.下载libsvm https://www.csie.ntu.edu.tw/~cjlin/libsvm/ 2.解压到matlab2016a的安装目录的toolbox下 例如我的D:\Program ...
- MySQL时间段查询,无数据补0
上一节提到分时间段统计,可是无数据的时候不显示,而此时我们需要让他显示0. 首先我们需要建一个时间表. CREATE TABLE `my_date` ( `date` date NOT NULL, P ...
- hibernateTools插件安装
先去官方网站工具页面 http://hibernate.org/tools/ 点击Download 然后出现 你可以选择在线安装 在eclipse里面.help->install->add ...
- java在图片上添加文字
业务需求要在图片上添加水印.下面粘出代码供自己和大家分享 package com.pro.drawTextOnImg; import java.awt.Color; import java.awt.F ...
- HDU 3221 Brute-force Algorithm
题意:问funny被调用了多少次,结果ModP,P不一定为质数. 首先很容易发现递推公式fn=fn-1*fn-2;写出前几项a,b,a*b,a*b^2,a^2*b^3,a^3* ...
- FruitFrolic
这是一个连连看小游戏,以 Unity2D 开发.因用了数种水果图片来做头像,所以游戏取名 FruitFrolic.同样,它也只是我闲时的练手. 少时曾玩过掌上游戏机里的俄罗斯方块及打飞机,及手机上的推 ...
- QQ模拟自动登录实现
QQ模拟自动登录实现 本篇文章主要介绍"QQ模拟自动登录实现(带验证码)",主要涉及到java 实现QQ自动登录(带验证码)方面的内容,对于java 实现QQ自动登录(带验证码)感 ...