zoukankan      html  css  js  c++  java
  • Cocos DrawCall测试

    版本:2.4.3

    参考:

    Cocos Creator 性能优化:DrawCall(全面!)

    【乐府】突破动态合图-你真的把动态合图用对了吗?

    主要是看论坛水友陈皮皮的文章《Cocos Creator 性能优化:DrawCall》,实际测试下drawcall。

    一 碎图+动态合图测试

    使用4张碎图,理论4碎图+1调试信息文本 = 5 drawcall,但是实际测试drawcall是2。

    这是因为web默认开启了动态合图。动态合图会额外占用内存,不同平台内存占用不一样。

    web平台默认开启动态合图。

    小游戏和原生平台默认关闭动态合图。

    现在禁用动态合图,代码需要写在项目脚本中的最外层,不要在start或onLoad中禁用,确保在项目加载过程中即时生效。否则如果在部分贴图缓存已经释放的情况下才启用动态图集,可能会导致报错。 

    const {ccclass, property} = cc._decorator;
    
    //是否在将贴图上传至 GPU 之后删除原始图片缓存,删除之后图片将无法进行 动态合图。 
    //web平台不需要开启,因为web平台Image占用内存小。
    //小游戏平台默认开启,避免内存占用过高。
    cc.macro.CLEANUP_IMAGE_CACHE = true;
    //禁用动态合图
    cc.dynamicAtlasManager.enabled = false;
    
    @ccclass
    export default class Helloworld extends cc.Component {
        start(){
            console.log(cc.macro.CLEANUP_IMAGE_CACHE, cc.dynamicAtlasManager.enabled);  //true, false
        }
    }
    

     

    关闭动态合图后,可以看到4碎图+1调试信息 = 5 drawcall。

     

    1. 动态合图出现,是因为项目过大贴图过多,导致很难使用静态合图Auto Atlas将图片合并到一个图集上。

    2.动态合图会占用内存,在小游戏和原生平台默认关闭。

    3.动态合图最大张数5张,使用完会重建,单张合图最大2048*2048。

    4.如果一直不切换场景,那么随着动态合图的数量增长,渲染效率可能会降低,适得其反。

    5.动态合图不用,记得剔除“Dynamic Atlas”模块以减小引擎包体。

    二 碎图+AABB+ABAB测试

    AABB:来自同一张图的UI并列排放,drawcall仍然按1个算。

    2个icon_001 + 2个icon_002 + 1调试信息 = 3 drawcall

    ABAB:交叉的排放,drawcall会增加。

    2个icon_001 + 2个icon_002 + 1调试信息 = 5 drawcall

    总结:

    所以来自同一图集的UI,尽量并列排放,可以减少drawcall。

    三 自动合图测试(Auto Atlas)

    静态合图可以使用TexturePacker或者AutoAtlas。

    因为TexturePacker比较麻烦,每次美术增加或修改了UI,你得再用软件去合图一次, 所以还是直接使用AutoAtlas。

    自动合图需要构建时才会生效,平时调试时不会生效的。

    总结:

    使用AutoAtlas。

    四  系统字体文本测试 

    1 系统字体文本打断渲染合批

     如果添加系统字体文本label,则会打断合并批次提交。

    2 icon_001 + 1调试信息 + 1文本 = 4 drawcall

    2 文本三种缓存模式

    NONE:

    没有任何操作,3个文本会打断icon渲染合批,并且3个文本算3个drawcall。

    2icon_001 + 3文本 + 1调试信息 = 6 drawcall

    BITMAP:

    如果关闭动态合图,则这一项没用。依然是

    2icon_001 + 3文本 + 1调试信息 = 6 drawcall。

    如果开启动态合图,则icon和文本会合并,2个icon和3个文本相当于1个drawcall。

    2icon_001 + 3文本 + 1调试信息 = 2 drawcall

    CHAR:

    共享位图的最大尺寸为 2048*2048,占满了之后就没办法再渲染新的字符,需要切换场景才会清除共享位图。

    和动态合图无关,字符会缓存到一张图上,所以3个文本相当于1个drawcall。

    2icon_001 + 3文本 + 1调试信息 = 4 drawcall

    总结:

     普通界面,关闭动态合图情况下,选择CHAR模式,并将文本并列排放,则能减少drawcall。

    五 BMFont文本测试

    1. BMFont会打断渲染合批

    2icon_001 + 2BMFont + 1调试信息 = 5 drawcall

     

     2. BMFont没有缓存模式,可以参与Auto Atlas静态合图。

    将BMFont的图片和icon图标一起静态合图

    2 icon + 2 BMFont + 1 调试信息 = 2 drawcall

    总结:

    大部分BMFont基本都是通用型,可能贯穿游戏很多个界面,所以合图并到某个界面不合适。

    在关闭动态合图的情况下,和系统字体CHAR模式类似,只能相邻排放来减少drawcall。

  • 相关阅读:
    node.js代码
    弹性盒和多列布局
    浏览器兼容性
    图片整合与宽高自适应
    百度分享自定义设置
    设置Cookie,登录记住用户登录信息,获取用户登录过得信息
    验证用户是否登录,是否有过注册信息
    循环显示切换
    ajax提交表单 验证
    简单易用的点击展开伸缩效果
  • 原文地址:https://www.cnblogs.com/gamedaybyday/p/14235864.html
Copyright © 2011-2022 走看看