WebAssembly 2023 目标包含的功能可以提高代码性能,减少生成的代码大小,并缩短 Web 构建在所有受支持的浏览器和平台上的下载时间。
如果启用 WebAssembly 2023 目标,则会自动启用以下所有优化功能:
| 部分 | 描述 |
|---|---|
| WebAssembly 原生异常 | 异常处理,开销小于基于 JavaScript 的异常。 |
| 对 WebAssembly 单指令多数据 (SIMD) 的支持 | 提高执行大量数学计算或复杂顶点操作的应用程序的性能。 |
| 优化的数据操作 | 适用于大量数据操作。 |
| 对 BigInt 的支持 | 改进 WebAssembly 和 JavaScript 代码之间的数据交换。 |
| WebAssembly.Table | 提高 WebAssembly 和 JavaScript 之间的互操作性。 |
| 加快数据类型转换 | 减小代码大小并略微提高性能。 |
这些功能需要在浏览器上受到支持才能正常使用。要查看受支持的浏览器,请参阅 WebAssembly 2023 的先决条件。
要了解如何启用 WebAssembly 2023,请参阅启用 WebAssembly 2023。
在原始 WebAssembly MVP 功能集中,异常处理依赖于 JavaScript 异常机制。这种异常处理形式导致开销相对较高。此后,WebAssembly 开发了自己的原生异常处理支持,从而减少了开销问题。
如果启用 WebAssembly 2023,则会自动启用 WebAssembly 原生异常语言功能。这些原生异常可以提高运行时性能并减少 .wasm 代码大小。
WebAssembly SIMD 功能使 Unity 能够使用浏览器提供的 SIMD 指令支持。在内部,浏览器以 x86 Intel 和 ARM 架构中的 SIMD 指令集为目标。因此,此功能适用于受支持的桌面端和移动端浏览器。有关受支持浏览器的列表,请参阅 WebAssembly 2023 的先决条件。
WebAssembly SIMD 支持包括自动矢量化支持。如果在代码的短循环中有标量算术计算,则自动矢量化会自动将其转换为 WebAssembly SIMD 数据并行形式。在这种形式中,代码的执行速度更快,因为会同时处理多个计算。
如果您有执行繁重矩阵数学的操作,例如角色蒙皮或动画关键帧和变换计算,WebAssembly SIMD 功能可能会产生重大影响。
如果应用程序执行大量数学计算或复杂矢量操作,此功能可以显著提高运行时性能。
WebAssembly 2023 可以改进 memcpy 和 memset 函数的代码生成。这种改进的代码生成可在代码复制或设置大量数据时产生更好的性能。
WebAssembly 2023 启用 WebAssembly.BigInt 语言功能。在 JavaScript 和 WebAssembly 代码之间交换数据时,可以使用 WebAssembly.BigInt 访问 JavaScript BigInt 数据类型。然后可以使用 BigInt 数据类型在 JavaScript 和 WebAssembly 代码之间原生发送和接收 64 位整数,而无需将 64 位整数拆分为 32 位数字的高阶和低阶 (HI/LO) 对。
这种改进的通信方式可以改善两个接口之间的封送边界,从而提高封送性能并生成更小的代码。
您还可以启用 WebAssembly.BigInt 支持,而无需其他 WebAssembly 2023 功能。有关该功能以及如何单独启用该功能的更多信息,请参阅 WebAssembly 语言功能。
注意:如果在使用 64 位整数的 JS 和 WebAssembly 语言边界之间已经有封送代码,请将代码调整为使用 JS BigInt 功能的更新的 64 位封送模式。
例如,如果有一个如下所示的整数:
const number = 12345678901234567;
将其转换为 BigInt,如下所示:
const bigInt = BigInt(number);
有关更多信息,请参阅 Emscripten 文档。
Unity WebAssembly 2023 功能集使 Unity Emscripten 工具链能够面向 WebAssembly.Table 语言功能。每当通过指针调用函数时,此功能都会简化代码生成。此外,由于 Emscripten 编译器在编译期间需要的通道更少,因此编译时间会更短。
要通过指针调用函数,请使用 {{{ makeDynCall }}} 宏。
有关 JavaScript 对象的更多信息,请参阅有关 WebAssembly.Table 的 Mozilla 文档。
您还可以在播放器 (Player) 设置中启用 WebAssembly.Table 支持,而无需其他 WebAssembly 2023 功能。有关该功能以及如何单独启用该功能的更多信息,请参阅 WebAssembly 语言功能。
注意:Emscripten 函数 dynCall_*() 和 Module.dynCall() 已弃用。如果您的 JavaScript 插件代码使用这些函数,请改用 Emscripten {{{ makeDynCall() }}} 宏。
如果启用 WebAssembly 2023,Unity 将使用更短的低级指令序列实现以下转换:
float 到 int
double 到 int
这些转换会减小代码大小并略微提高运行时性能。