WebAssembly 2023 ターゲットには、サポートするすべてのブラウザーとプラットフォームでコードのパフォーマンスを向上し、生成するコードサイズを削減し、ウェブビルドのダウンロード時間を短縮できる機能が含まれています。
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 インテルおよび ARM アーキテクチャの SIMD 命令セットをターゲットにしています。そのため、この機能はサポートされているデスクトップとモバイル両方のブラウザーで動作します。サポートされているブラウザーのリストについては、WebAssembly 2023 の前提条件 を参照してください。
WebAssembly SIMD のサポートには自動ベクトル化のサポートが含まれます。コードに短いループのスカラー演算がある場合、自動ベクトル化によって WebAssembly SIMD データ並列形式に自動的に変換されます。この形式では、多くの計算が同時に処理されるため、コードの実行が高速になります。
WebAssembly SIMD 機能は、キャラクターのスキニングやアニメーションのキーフレームと Transform の計算など、負荷の高い行列計算を実行する操作が必要な場合に大きな違いを生み出します。
アプリケーションが多くの数学的計算や複雑なベクトル操作を実行する場合、この機能によってランタイムパフォーマンスが大幅に向上する可能性があります。
WebAssembly 2023を使用すると、memcpy と memset 関数のコード生成が改善されます。コード生成の改善により、コードが大量のデータをコピーまたは設定する際のパフォーマンスの向上につながります。
WebAssembly 2023 では、WebAssembly.BigInt 言語の機能が有効になります。JavaScript と WebAssembly コード間でデータを交換するときに、WebAssembly.BigInt を使用して JavaScript BigInt データ型にアクセスできます。BigInt データ型を使用することで、JavaScript と WebAssembly コード間でネイティブに 64 ビット整数を送受信できます。64 ビット整数を 32 ビット数の上位および下位 (HI/LO) ペアに分割する必要はありません。
通信の改善により、2 つのインターフェース間の境界のマーシャリング境界が改善されます。マーシャリングのパフォーマンスが向上し、コードも小さくなります。
他の 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 オブジェクトの詳細については、WebAssembly.Table に関する Mozilla ドキュメントを参照してください。
他の WebAssembly 2023 機能を使用せずに、Player 設定で WebAssembly.Table のサポートを有効にすることもできます。この機能の詳細と個別に有効化する方法については、WebAssembly 言語機能 を参照してください。
ノート: Emscripten 関数の dynCall_*() と Module.dynCall() は非推奨です。JavaScript プラグインコードでこれらの関数を使用する場合は、代わりに Emscripten {{{ makeDynCall() }}} マクロを使用してください。
WebAssembly 2023 を有効にすると、Unity はより短い低レベルの命令シーケンスで以下の変換を実行します。
float から int
double から int
これらの変換によってコードサイズが削減され、ランタイムのパフォーマンスがわずかに向上します。