• 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.对于背景图这种很少用到且不可能大量加载的资源,应该分成单张图片,避免内存浪费。

  • 相关阅读:
    Qt消息机制和事件、事件过滤
    QTableview 获取鼠标坐标的item(QModelIndex)
    qt 拖放dropEvent
    Qt获取控件位置,坐标总结
    Quick Easy FTP Server FTP工具文件传输使用
    Qt QDialog将窗体变为顶层窗体(activateWindow(); 和 raise() )
    makefile 通配符了解% $@ $^ $<
    QLocalServer和QLocalSocket单进程和进程通信
    RC4 加解密
    qt 拷贝文件设置进度条
  • 原文地址:https://www.cnblogs.com/Pickcle/p/5275598.html
Copyright © 2020-2023  润新知