接入指南 API 工具 其他

Unity WebGL 性能优化总览

为什么需要性能优化?

相比原生 App,Unity WebGL 导出的小程序存在性能瓶颈,主要原因如下:

  • 小游戏场景强调“即开即玩”,用户对加载等待时间更敏感。
  • WebAssembly 的执行效率低于原生平台,资源占用较高。
  • Unity 对 WebGL 平台支持有限,未做深度裁剪,启动性能较差。

因此,WebGL 小游戏需要从启动、加载、运行多个方面进行专项性能优化。


一、推荐 Unity 版本

  • 支持 Unity 2019 及以上版本
  • 强烈建议使用 Unity 2021 及以上版本
    • 支持 WASM 函数裁剪
    • 支持资源纹理 ASTC 压缩模式

二、定制启动封面

Unity WebGL 启动时间较长,建议使用图片或视频做启动封面,用于留住用户,改善加载体验。

详见:定制启动封面


三、加快启动速度

  • 游戏包体较大是启动慢的主要原因
  • 建议拆分资源,控制首包大小

参考文档:


四、WASM 代码优化

性能瓶颈说明

  • WASM 文件过大会延长下载与编译时间
  • WASM 编译需占用大量 CPU,对低端机影响较大

优化建议

  • 原始 code 文件建议不超过 30MB
  • 启用 Strip Engine Code
  • 使用 IL2CPP 构建选项:Faster (Smaller) Builds


五、资源按需加载

小游戏资源不能像 App 一次性下载,推荐使用 AssetBundle / Addressable 进行延迟加载。

AA/AB 包是常规的分包解决方案,关于他们的选择对于轻度游戏来说两者没有特别要求,倒是功能强大的 AA 包 使用门槛更低一些,而对于重度游戏,平台目前所反馈到的结论是使用 AB 包 的性能要比 AA 包 更好,AA 包较大项目时生成的未压缩的 catalog 较大,加载效率低,改用 AB 包后,效果提升明显。

  • 首屏资源置于首包
  • 剩余资源放入 CDN 并按需加载
  • AA(Addressable)适合轻量项目,AB 更适合大型项目

参考:


六、资源处理建议

  • 贴图 maxSize 控制在 1024 以内,小游戏环境适当降低画质
  • 禁用 Mipmap 和可写属性
  • 字体文件压缩前最大不超过 4MB

  • 纹理优化工具:操作路径:顶部菜单栏 -> 联盟快游戏 -> 纹理优化

    • 检索资源纹理
    • 配置优化规则
    • 开始优化

  • 接入资源缓存策略,对于二次进入游戏可以快速使用本地缓存


七、IndexedDB 适配优化

Unity 自有 API 会将 PlayerPrefs 写入 IndexedDB,导致性能消耗大。

Unity 插件 C# SDK 已优化此逻辑,支持无感替换适配方案,无需改动原有代码。


八、使用 Debugger 性能工具

先下载该工具并集成进项目中,会在 VIVO-GAME-SDK 增加 debugger 文件目录,其中有个 Debugger 预制体需要开发者放入到游戏的场景中:

  1. 集成 Debugger 组件并挂载到场景
  2. 打包后显示帧率、内存等信息

包括:

  • Console:日志信息
  • Information:设备/输入/渲染等信息
  • Profiler:资源内存占用明细(Texture/Mesh/Shader 等)


九、运行性能建议

性能指标:

  • FPS 显示的是当前游戏运行过程中的实时帧率,当帧率低于 15 画面出现卡顿;

  • 总内存 当总内存在 2G 左右时,需要根据以下手段进行相应的优化 ,通常来讲 Unity WebGL 是 APP 手游性能的 1/3。

帧率低问题排查:

  • 使用 Application.targetFrameRate 设置合适帧率
  • 禁用 Development Build 减少调试开销
  • 使用 chrome 调试的 JS Profiler排查卡顿问题

优化建议

  • 图片资源关闭 MipMap 功能,对于 UI 贴图来说,我们不必应用 mipmap,因为一般的 UI 都是“平铺”在正交摄像机视口的,和摄像机没有距离这一概念,所以我们大可以把 UI 贴图的 mipmap 选项去掉,以节省内存;

  • 卸载不用的 AssetBundle 资源

  • 合理设置纹理 maxsize 可以减小纹理资源大小,最大不要超过 1024;
  • 使用资源预下载功能提升加载流畅度
  • 替换为小游戏平台的文件操作 API(C# SDK 提供)
  • 尽量关闭贴图可写属性、MipMap
  • Unity WebGL 环境的 lua 不支持 JIT,因此需要避免用于重度逻辑;
  • 减少 DrawCall,合并材质
  • 推荐使用 ASTC(Unity 2021+)压缩纹理,推荐 8x8 block

参考资料:

条匹配 "" 的结果

    没有搜索到与 "" 相关的内容