通常,您获得的性能应该接近于 GPU 上的原生应用程序,这是因为 WebGL 图形 API 使用 GPU 进行硬件加速渲染。将 WebGL API 调用和着色器转换为操作系统图形 API(通常是 Windows 上的 DirectX,或者是 Mac 或 Linux 上的 OpenGL)会有少量开销。
在 CPU 上,Emscripten 会将您的代码转换为 WebAssembly,因此性能取决于 Web 浏览器。有关更多信息,请参阅 Unity 博客文章 WebAssembly 加载时间和性能 (WebAssembly Load Times and Performance)。
还有一些其他事项需要注意。JavaScript 语言不支持多线程和 SIMD。受益于这些功能的任何代码可能比其他代码都要慢。无法在脚本中为 WebGL 编写线程代码和 SIMD 代码,但有些引擎部分通常为多线程或经过 SIMD 优化,因此在 WebGL 上的性能会降低。一个示例是蒙皮代码,这种代码既为多线程,又经过 SIMD 优化。
借助 Unity 中新增的时间轴性能分析器,可查看 Unity 如何将工作分配到非 WebGL 平台上的不同线程。
为获得最佳性能,请在 Build Player 对话框中将优化级别设置为 Fastest,并在 WebGL 的 Player 设置中将 Exception support 设置为 None。
WebGL 支持 Unity 性能分析器。请参阅性能分析器文档以了解如何设置性能分析器。
如果在 WebGL 平台的 Player 设置中启用了 Run in background,或者如果启用了 Application.runInBackground,您的内容将在画布或浏览器窗口失去焦点时继续运行。
但是,某些浏览器可能会限制在后台标签页中运行的内容。如果包含该内容的标签页不可见,在大多数浏览器中,您的内容每秒才会更新一次。请注意,这将导致 Time.time 比平常采用默认设置时更慢,因为 Time.maximumDeltaTime 的默认值小于一秒。
在某些情况下,可能希望以较低的帧率运行 WebGL 内容,以降低 CPU 使用率。与其他平台一样,可使用 Application.targetFrameRate API 来实现此目的。
如果不想限制性能,请将此 API 设置为默认值 –1,而不是较高的值。如此,浏览器便可调整帧率以便在浏览器的渲染循环中实现最平滑的动画,获得的效果可能好于 Unity 尝试执行自身的主循环时序来匹配目标帧率。