【Unity】WebGL注意事项


多线程

WebGL环境不支持多线程,因此:

  • 不能使用:System.ThreadingTask.Run()之类的多线程操作
  • 不能使用:Burst编译的JobSystem也是多线程

多线程编程异步编程是两个不同的概念

WebGL支持异步编程

  • 可以使用:asyncTask(只要没有使用Tak.Run()将任务调到新的线程上就OK)
  • 可以使用:IEnumerator协程
  • 可以使用:UniTask是完全在PlayerLoop上运行的,没有使用Thread(除了UniTask.RunUniTask.SwitchToThreadPool

文件系统访问限制

WebGL是运行在浏览器中的,没有访问本地系统的权限:

  • 不能使用:System.IO访问本地文件
  • 可以使用:PlayerPrefs.SetString(),使用后务必在使用PlayerPrefs.Save();确保保存。
  • 可以使用:WWWUnityWebRequest加载远程资源

数值精度

  • JavaScript 只有一种数值类型 Number(64位双精度浮点数),用来表示所有的数值,包括整数和浮点数

  • Unity的float(32位单精度浮点数),在WebGL上运行时,float的精度还是会维持在32位

  • GPU在移动设备,尤其是低端设备上会降级浮点数的精度。当float降级成16位时,对该数据的影响就非常大了

拓展:

  • 精度降级不一定只发生在WebGL上,会发生在所有GPU计算上,尤其是涉及图形渲染
  • 通常分为16/32/64三个等级精度
  • 16位浮点数:
    • 规则:
      • 1位符号位,表示正数或负数
      • 5位指数位,表示数值的范围
      • 10位尾数位,表示数值的精度
    • 范围:
      • 最小正数:0.000061
      • 最大正数:65504
  • 32位范围:1.175×10^−38~`3.4×10^38`
  • 64尾范围:2.225×10^−308~`1.8×10^308`

缺失功能和插件

  • 部分插件无法使用,如Magica Cloth 2,插件是否支持WebGL具体查看插件官方文档
  • 不支持本地系统API,如访问操作系统功能、摄像头等
    • System.DateTime函数可能会表现的不同
    • System.Reflection执行效率较低
    • 不支持的API在打包时能看到警告

音频限制

  • 格式:WebGL支持的音频格式有限,建议使用 .ogg.mp3 格式

  • 延迟:由于浏览器的音频API限制,播放音频时可能有延迟,特别是首次播放音频。

调试

  • 可以使用F12查看Debug.Log日志,但无法调试

内存管理

浏览器分配的内存有限

  • 优化代码:
    • 避免过多的动态分配内存,防止内存泄漏
    • 手动释放不需要的资源(如Texture, Mesh, List等)
  • 资产:使用更小的纹理、网格和其他资源

性能优化

  • 减少Draw Calls
  • 限制帧率,以减少CPU负担

打包设置

参考:

Unity使用WebGL发布项目和注意事项