cocos creator性能优化合集

看了很多的博客,大略的总结了一下,推荐去看原文。

参考以下博客: 博客1 博客2 博客3

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