# ウェブパフォーマンスの考慮事項

> Web performance considerations.

一般的に、WebGL グラフィックス API はハードウェアアクセラレーションレンダリングに GPU を使用するため、GPU 上のネイティブのアプリケーションに近いウェブパフォーマンスが得られます。唯一の例外は、WebGL API 呼び出しとシェーダーを OS のグラフィックス API (通常は Windows の DirectX、Mac と Linux の OpenGL) に変換するためのわずかなオーバーヘッドです。

CPU では、Emscripten がコードを WebAssembly に変換します。このパフォーマンスは使用するウェブブラウザーに依存します。

以下の点に注意する必要があります。

* Unity は C/C++ コードにマルチスレッド機能を提供していますが、WebAssembly の制限により、C# コードにはまだ提供していません。
* レンダリングに WebGL API を使用する場合、 CPU 側の WebGL 操作のディスパッチはネイティブの OpenGL よりも低速になります。結果として、最高のパフォーマンスを得るために推奨されるベストプラクティスは、フレームごとのドローコールの数が多くならないようにすることです。そのため、シェーダーにインスタンス化とバッチ処理の両方の技術を使用するようにしてください。
* WebAssembly 2023 機能セットの一部として、ウェブでの SIMD がサポートされています。新しいブラウザーで最高のパフォーマンスを得るには、WebAssembly 2023 を有効にしてください。

\*\*ヒント:\*\*Unity の新しいタイムライン [プロファイラー](/engine/6000.0/manual/analysis/profiler.md) を使って、ウェブプラットフォーム以外で Unity がどのように異なるスレッドに作業を分配しているかを確認できます。

## パフォーマンスに影響するウェブ固有の設定##web-specific-player-settings-that-affect-performance

パフォーマンスを向上するには、ウェブの Player 設定で **Other Settings > Stack Trace** を展開し、**Exception support** を **None** に設定します。

## プロファイラーによるパフォーマンスデータの収集##collect-performance-data-with-the-profilerscrollpoint-id=profiler-/

[プロファイラー](/engine/6000.0/manual/analysis/profiler/introduction.md) はウェブプラットフォームで使用できますが、ウェブでビルドした実行中のプレイヤーにエディターからアタッチすることはできません。これは、WebGL API が通信に WebSocket を使用し、ブラウザー側での着信接続が許可されないためです。

実行中のプレイヤーにアタッチするには、**Autoconnect Profiler** 設定を有効にする必要があります。

1. **Build Profiles** ウィンドウ (メニュー: **File > Build Profiles**) を開きます。
2. ウェブプラットフォームを選択します。
3. **Development Build** 設定を有効にします。
4. **Autoconnect Profiler** 設定を有効にします。

**注意**Unity はウェブアプリケーションのドローコールをプロファイルできません。

詳細は、[プロファイラーとデータソースの接続](/engine/6000.0/manual/analysis/profiler/collect-data/profiling-applications.md) を参照してください。

## バックグラウンドタブでのウェブコンテンツ##web-content-in-background-tabs

以下のいずれかのオプションが有効になっている場合、キャンバスまたはブラウザーウィンドウがフォーカスされなくなってもコンテンツの実行が続行されます。

* [ウェブプラットフォームの Player 設定](/engine/6000.0/manual/platform-specific/webgl/develop/class-player-settings-web-gl.md) の **Run in background**
* [Application.runInBackground](/engine/6000.0/script-reference/unity-engine/application/run-in-background.md)

ただし、一部のブラウザーでは、バックグラウンドタブで実行されているコンテンツを抑制できます。コンテンツのタブが表示されない場合、コンテンツはほとんどのブラウザーで 1 秒に 1 回しか更新されません。これにより、デフォルト設定で [Time.time](/engine/6000.0/script-reference/unity-engine/time/time.md) の進行が通常よりも遅くなることに注意してください。[Time.maximumDeltaTime](/engine/6000.0/script-reference/unity-engine/time/maximum-delta-time.md) のデフォルト値が 1 秒未満であるためです。

## ウェブパフォーマンスのスロットリング##throttling-web-performance

一部の状況で、CPU の使用を減らすために低いフレームレートでウェブコンテンツを実行したい場合があります。例えば、他のプラットフォームでは、[Application.targetFrameRate](/engine/6000.0/script-reference/unity-engine/application/target-frame-rate.md) API を使用してこれを行うことができます。

パフォーマンスを減速したくない場合、この API にデフォルト値 -1 を設定します。これにより、ブラウザーのレンダリングループで最も滑らかなアニメーションにフレームレートが調整され、Unity がそのメインループのタイミングをターゲットフレームレートに合わせて調整するよりもよい結果が得られる場合があります。

**ノート**: セキュリティ上の理由から、Unity はブラウザーにフレームレートをクエリできません。その結果、Unity はすべてのブラウザーのディスプレイ レートを 60 fps と仮定し、その値に基づいて `Application.targetFrameRate` を設定します。
