CocosCreator性能优化手册

# 优化加载速度
* 优化包体大小
    1. 资源
        - 图片
            <1> 减少使用大图,尽可能的使用九宫格
            <2> 图片压缩
                (1). 两套压缩,ios使用pvr,android使用etc1,未来可以统一使用etc2(部分旧机型不支持)
                (2).使用第三方压缩软件,直接图片本身,但要注意大部分压缩是有损的,比如近期使用过的tinypng,原理上大概与etc类似也是将4*4的像素块压缩成一个数据块,内部记录像素索引和偏移值,虽然压缩后整体的图片效果还是可以的,但遇到非常小的图像区域损失就会很大,比如过小的面部图片,或者仅几个像素宽度需要放大使用的光效图等
            <3> 使用图集
                自动图集,或者使用texturepackager,这部分主要注意如何合理划分图集,要考虑使用密度以及更新粒度(比如热更新的时候因为一个小图的改动却需要更新一张很大的图)等
        - 声音,视频
            如果是内嵌到app内的项目,可以考虑将声音和视频剔除,改由app播放,而不是直接使用audioclip等,通常这样是完全可以实现的
        - 动画
            <1> 按需求选择合适动画类型,比如多动作的人物动画选择骨骼动画,适当的使用换装提高资源复用率
            <2> 尽量避免大的动画文件,文件越大解析耗时越多
            <3> 有条件的话可以对动画文件做序列化,将数据读取后传换成结构体保存,游戏运行时直接读取序列化后的数据,这样能有效降低解析时间
            <4> 纹理适当压缩
            <5> 合理的使用一些shader,比如高亮,闪烁,内外发光等简单的动画效果完全可以用shader实现
        - 字体
            <1> 对于比较固定的文字控件可以用图片代替
            <2> 一些确定性高的ui文字等,可以自行制作最小化的字体文件
        - json
            适当的合并json文件,以降低请求数量,但会增加单个文件的的加载速度,所以要按需求划分合并
        - 预制体
            实例化过程:从文件中读取数据 → 反序列化数据 → 还原得到Prefab节点树 → 预处理 → 实例化
            <1> 合理拆分预制体,避免单个预制体过大导致读取和解析文件耗时长
            <2> 避免在单个预制体中有过于复杂和过多的节点层级
            <3> 在场景中选择延迟加载资源,但这样会导致资源在预制体显示的时候才会下载,会有显示延迟,所以要根据需求决定
            <4> 合理选择优化策略,比如需要多次使用的预制体应该用“优化多次创建性能”,这样在load的时候会对其做预处理和jit优化,增加了load时间但有效提高了后续实例化效率;如果是单个场景里只会出现一次的,可以选择“优化单次创建性能”,这将不会增加load负担
    2. 代码
        发布的时候不需要的引擎模块不要勾选
    3. 合理使用resources目录,不需要动态加载的代码和资源不要放到该目录下
    4. 合理使用bundle
        适当的按模块划分出不同的bundle,在需要的时候动态加载下来,一降低整个项目的原始大小,注意处理好bundle的优先级
    5.场景加载优化
        <1> 合理拆分场景,避免单个场景过大,尽量使用预制体组合场景而不是一个完全独立的静态场景,并且适当的将一部分预制体动态做动态加载
        <2> 设计一些过度场景或加载界面,比如课件,在加载界面或过度场景做下个场景的预加载
* 优化网络和下载
    1. 预设多个备用cdn,实现多cdn自动切换
        - creator的download模块可以对全局或单个资源设置超时次数和超时时间,默认为3次,但若因网络问题导致用户超时2次或3次,多个资源的等待就会极大下载延迟.为优化这种问题,多cdn切换是有必要的,即超时一次就自动切换cdn重试,若所有域名都切换一次仍然延迟直接判定网络故障
        - 域名切换需要注意处理好跨域问题,以及字体的重新加载问题,因为creator处理字体加载事实上是把字体作为字体标签直接挂载在document上,包含了字体文件的url,并且以字体名称为key记录在字体缓存表中,这样下个场景或场景刷新需要重新加载字体的时候会跳过挂载,直接使用已有标签,这时候url还是上一次的url,如果上次url已不可用会出现场景视图掉字体的情况
    2. 若是内嵌app的项目,可以考虑将项目直接打包进app,或由app在合适的时候下载项目到本地,在app内部启动一个本地server

# 优化渲染速度
1. 优化drawcall,合理使用合图,合理规划节点排列,避免打断合批.
2. spine动画,骨骼动画,label,mesh,完全不同或仅参数不同的shader都会打断合批.项目开发的过程中要时刻注意drawcall的增加

# 优化内存
1. 使用场景设置中的“自动释放资源”
2. 管理好动态加载的资源,要在合适的位置手动释放,避免动态资源忘记释放的情况
3. 使用对象缓冲池,尽可能的复用对象,比如子弹,背包列表等

# 优化cpu占用
1. 分帧加载,避免在同一帧大批量加载某些资源,通过延迟函数等方式将大批量的加载或实例化延迟到此后数帧,以降低某一帧的压力
2. 优化滚动列表等包含大量子元素的控件,根据适配动态的计算出一屏所能容纳的元素数量,只创建多出两个或多个的子元素,通过动态更改元素位置的方法复用节点.这个在游戏背包系统会大量用到,比如卡牌背包,数量往往能达到上百个或者更多,这个时候全部创建显然是不现实的
3. 代码层级上,尽量使用原始的for循环,而不是foreach,for in等写法
4. 可以根据需求在某些位置适当的控制帧率

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值