Cococs性能优化方式
最近在开发一款2D的cocos游戏,运行在Web端,开发过程中遇到了几个性能优化的点,这些点对于做过游戏开发的人来说比较常见,但是再cocos这里踩了一些其他的坑,在这里简单记录下
资源异步加载
对于首屏不需要的资源可以通过异步加载Bundle的方式去延迟加载。
这里有一个点要注意,就是不要把那种loadBundle的回调函数的方式用Promise包裹,然后在那里await。
因为原本的loadBundle执行之后,会把下载任务交给其他进程,JS可以继续执行,等到其他进程下载完成后通知JS,如果改为await的方式,那么这段时间JS也会被卡住,会导致一些游戏卡顿的异常问题。
图集打包
图集打包是最常见的降低Draw Call的方案,cocos中可以在文件夹中创建自动图集配置,这样可以让cocos在运行时,将图集相同的节点去合批渲染。
但是有个问题,如果你的首屏节点中用到了图集配置,即使你的首屏节点只用了图集中的一个图,你的整个图集中的所有图片都会被打包进首屏的Bundle中
降低着色器计算精度
这个是降低GPU消耗最快的方式,如果不影响效果,可以尝试降低着色器的计算精度
在自定义着色器代码时,需要注意一点,cocos必须要在Sprite组件中制定一个贴图,才能获取其uv,如果你的这个图属于某个图集,那在着色器中,你的uv的坐标范围就不是0-1,而是这个图在图集中的uv范围,这个要注意
避免再Update函数中进行复杂判断
由于我的游戏逻辑中会不断创建和销毁某些物体,我就在某个全局存在的Component的Update函数中不断检查物体的数量,保证其能支持玩法的进行,但是这样就会导致每一帧都要检查完才可以进入下一帧。
如果这些逻辑不是必须每一帧都执行,可以通过设置定时器的方式去执行,避免放在Update函数中卡住游戏渲染逻辑
对象池
对象池作为一个游戏中常用的优化手段,Cocos也是支持了一个原生的API,NodePool,不过这个是一个类似数组的东西,它不能区分放入其中的对象是否是相同的,所以还需要自己封装一层。