zl程序教程

您现在的位置是:首页 >  Java

当前栏目

微信小游戏性能优化

2023-02-18 16:48:07 时间

| 导语【整合cocos博客、微信小游戏及laya性能优化官方文档总结并实践】业务中实践cocos导出的微信小游戏性能优化案例,希望对大家有所帮助~

一、背景

业务中实践cocos导出的微信小游戏性能优化 优化前后对比

二、性能优化过程(通用)

参考 laya官方性能优化指南:https://ldc2.layabox.com/doc/?nav=zh-ts-2-2-1 cocos性能优化博客:https://new.qq.com/omn/20210413/20210413A04JEH00.html 微信小游戏性能优化指南:https://developers.weixin.qq.com/minigame/dev/guide/performance/perf-overview.html

比较通用的项目级的优化策略,整合cocos博客、微信小游戏及laya性能优化官方文档总结并实践

1、场景优化策略

自动释放资源 优化前

优化后

2、图集批次合并

1)静态图集

使用cocos自带工具的自动图集配置 https://docs.cocos.com/creator/2.0/manual/zh/asset-workflow/auto-atlas.html

点击preview可查看生成打包图集,注意command+s保存

2)动态图集(包括文字)

优化前

优化后

对其他场景采用类似方法 最好还是使用位图字体(bmpfont (.png + .fnt 文件)),几个字母 + 图片,体积远远小于一个完整的字库(系统字体也是这样)

3、prefab优化

在 Prefab 的属性检查器中,我们可以看到优化策略这个选项。这个也需要我们根据实际的使用情况进行选择。 当我们选择“优化多次创建性能”这个选项时,Prefab 加载后会进行一个预处理的操作,这个预处理其实就是动态生成一些 Prefab 的实例化代码,并把这些代码交给 jit 去进行优化。这样在实例化时的耗时将会大大减少,相应的,在 load 时的耗时会有所增加。 当我们选择“优化单次创建性能”这个选项时,Prefab 加载后会跳过预处理的步骤,这样在加载时的耗时会减少很多,但实例化时的耗时会增加。例如一些固定 UI 界面,用于方便加载场景或者进行功能划分,通常会做成 Prefab,这种 Prefab 只会加载一次的,就可以选择这个选项,提升加载的性能。

需要注意的有一点:由于微信小游戏平台禁用了动态加载代码,类似 eval 这些不能使用,因此优化策略这个选项在微信小游戏平台是无效的。

4、代码体积

引擎:把不要的模块去掉就可以,你要知道哪些模块是占体积多的。物理引擎,能不用的模块,就不用。【项目设置】-【模块设置】,只打包必要模块即可。后查看cocos2d-js-min.js体积

5、资源纹理压缩

参考 https://forum.cocos.org/t/topic/106919

在cocos creater里面进行简单的配置,就可以在打包小游戏的过程中把图片进行纹理压缩。 批量压缩参考cocos社区提供的脚本:https://www.chuyouxiang.com/archives/760 实测有bug,建议用pngyu压缩即可

6、减少try catch的使用

项目中尽量减少 try catch 的使用,被 try catch 的函数执行会变得非常慢。

7、垃圾回收

小游戏中,JavaScript 中的每一个 Canvas 或 Image 对象都会有一个客户端层的实际纹理储存,实际纹理储存中存放着 Canvas、Image 的真实纹理,通常会占用相当一部分内存。 每个客户端实际纹理储存的回收时机依赖于 JavaScript 中的 Canvas、Image 对象回收。在 JavaScript 的 Canvas、Image 对象被回收之前,客户端对应的实际纹理储存不会被回收。通过调用 wx.triggerGC() 方法,可以加快触发 JavaScriptCore Garbage Collection(垃圾回收),从而触发 JavaScript 中没有引用的 Canvas、Image 回收,释放对应的实际纹理储存。 但 GC 具体触发时机还要取决于 JavaScriptCore 自身机制,并不能保证调用 wx.triggerGC() 能马上触发回收 使用场景

  1. 建议在每局游戏开始或结束触发一下。
  2. 配合wx.onMemoryWarning 监听内存告警事件使用
  3. 在场景切换的时候主动调用 wx.triggerGC

8、减少 Mask 组件数量

由于 Mask 组件需要在 stencil 和 content 前后都添加修改 gl 状态的 render command,因此使用 Mask 会打断我们的 DrawCall 批处理。 对于一些特殊的显示,例如圆角的 icon 等,如果条件允许,尽量不要使用 Mask 组件来进行处理,而是通过对资源进行处理达到同样的效果。目前 Mask 组件、Spine 组件、DragonBone 组件都会打断批处理,在节点结构上我们要避免被打断的情况发生。

9、借助cocos插件

YH Multi UI:https://forum.cocos.org/t/topic/134846 可以不用关心怎么去实现,怎么去优化,你直接用,自然DC就降下来了! 而且支持 一键转换

三、性能优化过程(代码逻辑)

业务中的游戏叫球生之路,是一款挡板接球撞击消除砖块的游戏,还有buff可以分裂多球

以下针对游戏代码逻辑做优化

1、游戏中多球碰撞检测

1)球到一定数量就不要再增加 目前是300做阈值,对象池初始节点数为50=》改成阈值200,初始200 2)看看碰撞体之间,有没有多余的判断,比如球跟球之间是否可以取消

2、首页关卡数据展示

1)远程获取 2)分页展示

四、测试性能工具

1. cocos 浏览器运行查看调试信息

其中drawcall可作为初步优化效果的重要依据

2. 微信小游戏真机调试工具

参考 https://developers.weixin.qq.com/minigame/dev/guide/performance/perf-action-memory-dev-profile.html

1) 微信开发者工具Performence与Memory

微信开发者工具中内置了Google Chrome DevTools 工具, DevTools可以帮助开发人员即时编辑页面并快速诊断问题,最终可以帮助开发人员更快地构建更好的小游戏。

2) Android真机性能工具

微信Android端自身集成了三种内存分析工具,分别是性能监控面板、Heap Snapshot、V8-CPU-Profile。开发者可通过三者监控Android真机环境下各性能指标。

3) PerfDog

移动全平台iOS/Android性能测试、分析工具平台。快速定位分析性能问题,提升APP应用及游戏的性能和品质。手机无需ROOT/越狱。手机硬件、游戏及APP应用也无需做任何修改,极简化即插即用。

3. 微信小游戏云测试(推荐)

云测试服务是微信小游戏团队为开发者提供的一套多模式在线测试服务,可以为用户提供智能、高效、稳定的云真机测试能力,帮助游戏快速进行功能、性能、兼容性、稳定性测试,并提供全面、专业、详实的产品质量评估和问题分析报告。

小游戏云测试服务具备下述能力和优势:

五、微信小游戏跑分优化

1、启动

1)数据预拉取

https://mp.weixin.qq.com/wxamp/devprofile/get_profile?token=1106658438&lang=zh_CN 开启功能后,在用户打开小程序时,小程序可提前拉取所需要的数据,从而提升小程序的加载速度。了解详情

小游戏暂时不支持

2)小游戏测速

查看开发文档

3)引擎分离

注意构建时需要删掉构建模版里的引擎源码压缩文件,才不会报md5不同

小游戏内置的cocos引擎插件源码有bug,进入自动释放资源的场景回循环报错,已反馈待修复:https://developers.weixin.qq.com/community/develop/doc/0004800f2043288b96ddd20ec5b800?fromCreate=0

4)代码依赖

无用代码删除

2、网络性能

1)数据周期性更新

开启功能后,小程序可在后台每隔12小时下载数据到本地,使小程序在弱网或无网条件下也可以正常使用。了解详情