这个问题有点难以回答,因为取决于许多因素。
通常情况下,在 GPU 方面,可期待获得接近本机应用程序的性能,因为 WebGL 图形 API 使用 GPU 进行硬件加速渲染:将 WebGL API 调用和着色器转换为操作系统图形 API(通常为 Windows 上的 DirectX 或者 Mac 或 Linux 上的 OpenGL)只需要少量开销。
在 CPU 方面,所有代码都将转换为 asm.js JavaScript。因此,可期待的性能情况很大程度上取决于所使用的 Web 浏览器的 JavaScript 引擎,目前在这方面存在着一些非常显著的差异。在撰写本文时(2015 年 11 月),Microsoft Edge 和 Mozilla Firefox 在 Unity 代码方面可提供最佳性能,因为目前只有这些浏览器利用 asm.js 规范针对这种情况使用优化的 JavaScript 代码 AOT 编译路径;在许多编程基准方面与本机代码相比,性能下降幅度在二分之一以内,这一系数也与我们部署到 WebGL 并在 Firefox 和 Edge 中运行的不同 Unity 内容中看到的结果相符。
但是,还有其他一些考虑因素。目前,JavaScript 语言既不支持多线程也不支持 SIMD。因此,受益于这些功能的代码将比其他代码出现更大的减速。无法在脚本中为 WebGL 编写线程代码和 SIMD 代码,但有些引擎部分通常为多线程或经过 SIMD 优化,所以在 WebGL 上会因此降低运行性能。一个示例是蒙皮代码,这种代码既为多线程,又经过 SIMD 优化。借助 Unity 中新增的时间轴性能分析器,可查看 Unity 如何将工作分配到非 WebGL 平台上的不同线程。从长远来看,我们希望这些功能也可以在 WebGL 上使用。
For best performance, set the optimization level to Fastest in the Build Player dialog, and set Exception support to None in the Player settings for WebGL.
WebGL 支持 Unity Profiler,请参阅此处了解如何对其进行设置。
If Run in background is enabled in the Player settings for the WebGL platform, or if you enable Application.runInBackground, your content continues to run when the canvas or the browser window loses focus.
However, it should be noted that browsers may throttle content running in background tabs. If the tab with your content is not visible, your content will only be updated once a second in most browsers. Note that this will cause Time.time to progress slower than usual with the default settings, as the default value of Time.maximumDeltaTime is lower than one second.
在某些情况下,可能希望以较低的帧率运行 WebGL 内容,以降低 CPU 使用率。与其他平台一样,可使用 Application.targetFrameRate API 来实现此目的。
如果不想限制性能,请将此 API 设置为默认值 –1,而不是较高的值。如此,浏览器便可调整帧率以便在浏览器的渲染循环中实现最平滑的动画,获得的效果可能好于 Unity 尝试执行自身的主循环时序来匹配目标帧率。