看了很多的博客,大略的总结了一下,推荐去看原文。
cocos creator 的性能优化这里分为四个方向去优化,包体优化,渲染优化,内存优化和cpu优化。
****点击链接查看性能合集百度脑图
1.包体优化,一个cocos creator 包包括资源和代码两部分,其中资源占的内存更多。
(1)图片:
- 不使用大图,如果是大背景图可以通过拼接或者是九宫格的方式,如果一张图超过2048*2048,就会导致在微信平台和小游戏平台出错,小游戏平台在加载的时候无法进入界面。
- 图片的格式,格式占的内存也不一样,jpg>png
- 图片分辨率,在我们创建项目的时候可以先通过降低图片的分辨率,再使用。可用在线工具:https://tinify.cn/
- 图片纹理压缩,在资源管理器选择图片(图集),然后在属性检查管理器中勾选useCompressTexture
(2)声音
- 声音格式,wav>ogg>mp3
(3)字体
- cocos支持三种字体:系统字体(label),动态字体(TTF)和位图字体(BMFont),系统字体使用cocos系统字体渲染,在渲染时候会打断draw call 的合批,建议使用位图字体,然后和ui一起打包成图集,可降低draw call。
(4)预制体
- 预制体使用对象池,大量的创建和销毁会导致性能很低。
- 预制体拆分。
- 异步创建预制体,在加载界面的时候就创建大量的预制体会加载很慢,可以使用异步加载的方式创建
//优化前:
for(let i = 0;i<=100;i++){
let node = cc.instamtiate(this.prefab);
node.parent = this.node
}
//优化后(异步加载):
for(let i = 0;i<=100;i++){
setTimeout(()=>{
let node = cc.instamtiate(this.prefab);
node.parent = this.node},i*100)}
2.代码,代码有两部分,引擎代码和业务逻辑代码(自己写的代码)
(1)引擎代码,可以在功能裁剪中去掉没有用到的模块,减少代码量。
(2)业务逻辑代码,这个只能自己优化了
2.渲染优化
(1)合图
- 静态合图(Auto Atlas):自动图集资源,把碎图打包到一张大图上,减少draw call的绘制,具体功能和Texture Packer相似,在资源管理器中创建Auto Atlas即可创建一张图集
- 动态合图(Dynamic Atlas):在精灵资源的属性检查器中勾选Packable才能开启动态合图,小游戏和原生平台默认关闭动态合图,需要手动开启
(2)少用active = true/false,active的使用要重新渲染节点树,可用设置ui位置或者透明度代替
(3)节点树批处理尽量不要背打断,系统字体label节点会打断draw call的渲染,可以用位图字体替代,并且把位图字体和ui一起打包到图集,可以减少draw call
3.内存优化
(1)静态资源优化,即自动释放场景资源,在项目中场景越来越多,我们把暂时不用的场景都自动释放,如一些二级场景。在资源管理器中选中场景,属性检查器中有自动释放资源选项,建议场景都勾选自动释放资源(除了经常使用的场景)
(2)2.动态资源,只有动态加载的图片才放在resources文件夹中,减少setting文件夹的大小
4.cpu优化
(1)代码的优化
- arr[arr.length] = 0代替arr.push(0)
- 相比其他循环少用for…in…循环
- 不推荐使用arguments
- 全局变量转换成局部变量使用
(2)游戏帧率的优化
- 渲染帧的降低
//只能设置15,30,60。3种帧率
Game.setFrameRate(frameRate: number | string) : void
Game.setFrameRate(30)
- 物理帧的降低,降低物理步长和各个属性的迭代次数,都会降低物理的检测频率,所以会更有可能发生刚体穿透的情况,使用时需要考虑到这个情况。
const system = PhysicsSystem2D.instance;
// 物理步长,默认 fixedTimeStep 是 1/60
system.fixedTimeStep = 1/30;
// 每次更新物理系统处理速度的迭代次数,默认为 10
system.velocityIterations = 8;
// 每次更新物理系统处理位置的迭代次数,默认为 10
system.positionIterations = 8; //降低物理帧,优化物理效果
phsic.enabledAccumulator = true;
cc.PhysicsManager.FIXED_TIME_STEP = 1 / 30;//默认值为1/60