WebAssembly 2023 目标包含可提高代码性能、减少生成的代码大小以及减少所有受支持的浏览器和平台上的 Web 构建下载时间的特性。
如果启用 WebAssembly 2023 目标,它将自动启用以下所有优化特性
部分 | 描述 |
---|---|
WebAssembly 本机异常 | 异常处理,开销低于基于 JavaScript 的异常。 |
支持 WebAssembly 单指令多数据 (SIMD) | 提高执行大量数学计算或复杂顶点操作的应用程序的性能。 |
优化的数据操作 | 适用于大量数据操作。 |
支持 BigInt | 提高 WebAssembly 和 JavaScript 代码之间的數據交换。 |
WebAssembly.Table | 提高 WebAssembly 和 JavaScript 之间的互操作性。 |
加速数据类型转换 | 减少代码大小并略微提高性能。 |
您的浏览器需要支持这些特性才能正常工作。要检查受支持的浏览器,请参阅 WebAssembly 2023 的先决条件。
要了解如何启用 WebAssembly 2023,请参阅 启用 WebAssembly 2023。
在原始的 WebAssembly MVP 功能集一个 功能集 是您可以用来在 Unity 编辑器中实现特定结果的一组相关包。您可以直接在 Unity 的包管理器中管理功能集。 更多信息
请参阅 词汇表 中,异常处理依赖于 JavaScript 异常机制。这种形式的异常处理会导致相对较高的开销。从那时起,WebAssembly 就开发了自己的本机异常处理支持,从而减少了开销问题。
如果启用 WebAssembly 2023,它将自动启用 WebAssembly 本机异常语言特性。这些本机异常可以提高运行时性能并减少 .wasm
代码大小。
WebAssembly SIMD 特性使 Unity 可以使用浏览器提供的 SIMD 指令支持。在内部,浏览器以 x86 英特尔和 ARM 架构中的 SIMD 指令集为目标。因此,此特性在受支持的台式机和移动浏览器上均可使用。有关受支持浏览器的列表,请参阅 WebAssembly 2023 的先决条件。
WebAssembly SIMD 支持包括自动矢量化支持。如果您的代码中存在循环短的标量算术计算,自动矢量化会将其自动转换为 WebAssembly SIMD 数据并行形式。在此形式中,代码可以更快地执行,因为许多计算是同时处理的。
如果您有执行大量矩阵数学运算的操作,例如字符 蒙皮将骨骼关节绑定到角色网格或“蒙皮”顶点 的过程。使用外部工具(如 Blender 或 Autodesk Maya)执行。 更多信息
请参阅 词汇表 或动画 关键帧标记动画中过渡的起点或终点的帧。关键帧之间的帧称为中间帧。
请参阅 词汇表 和变换计算,WebAssembly SIMD 特性可能会产生重大影响。
如果您的应用程序执行大量数学计算或复杂的向量操作,此特性可能会显著提高运行时性能。
WebAssembly 2023 启用了 memcpy
和 memset
函数的更好的代码生成。这种改进的代码生成在代码复制或设置大量数据时会导致更好的性能。
WebAssembly 2023 启用了 WebAssembly.BigInt
语言特性。当您在 JavaScript 和 WebAssembly 代码之间交换数据时,可以使用 WebAssembly.BigInt
访问 JavaScript BigInt 数据类型。然后,您可以使用 BigInt 数据类型在 JavaScript 和 WebAssembly 代码之间以原生方式发送和接收 64 位整数,而无需将 64 位整数拆分为高阶和低阶 (HI/LO) 的 32 位数字对。
这种改进的通信会导致两个接口之间更好的封送处理边界,从而提高封送处理性能并生成更小的代码。
您也可以在没有其他 WebAssembly 2023 特性的情况下启用 WebAssembly.BigInt
支持。有关此特性以及如何在单独启用它的更多信息,请参阅 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 对象的更多信息,请参阅 Mozilla 关于 WebAssembly.Table 的文档。
您也可以在 **Player** 设置中,在没有其他 WebAssembly 2023 特性的情况下启用 WebAssembly.Table
支持。有关此特性以及如何在单独启用它的更多信息,请参阅 WebAssembly 语言特性。
注意:Emscripten 函数 dynCall_*()
和 Module.dynCall()
已弃用。如果您的 JavaScript 插件代码使用这些函数,请改为使用 Emscripten {{{ makeDynCall() }}}
宏。
如果启用 WebAssembly 2023,Unity 将使用更短的低级指令序列来实现以下转换
float 到 int
double 到 int
这些转换会减少代码大小并略微提高运行时性能。