はじめに
Web Adaptive Performance (WebAP) は、Unity WebGLアプリケーションの動的最適化ツールです。
強力なPCから性能の低いスマートフォンまで、幅広いデバイスにわたって、視覚的な品質と安定したFPSのバランスを見つけるのに役立ちます。固定された制限に依存するのではなく、プラグインはフレームタイミングをリアルタイムで分析します。パフォーマンス低下の根本原因を特定し、安定するまでスムーズに負荷を軽減し、パフォーマンスの余裕(Performance Headroom)が得られれば品質を回復させます。
デバイスへの適応
デフォルトでは、Unityプロジェクトを最大品質設定で構成してください。現在のデバイスがその負荷を処理できない場合、プラグインは実行時(Runtime)に自動的に負荷を軽減します。
なぜWebAPを選ぶのか?
公式のAdaptive Performanceパッケージではない理由は?
公式のUnityパッケージは強力なツールですが、WebGLとは根本的に互換性がありません。これは2種類のプロバイダーに依存しており、どちらもブラウザの制限によって阻害されます。
- ネイティブプロバイダー (Android): 熱データを取得し、周波数を管理するためにシステムAPIに依存しています。ブラウザのサンドボックスはハードウェアへのすべてのアクセスをブロックするため、このアプローチは不可能です。新しいWeb標準(Compute Pressure APIなど)はCPUのみを監視し、3Dグラフィックスに関する正確なデータを提供しません。
- 基本プロバイダー (Basic Provider): Unityのクロスプラットフォームな数学的プロバイダー。これは
FrameTimingManagerに依存しています。しかし、エンジンが機能するためには、高精度のハードウェアGPUタイマーが必要ですが、ブラウザではセキュリティ上の理由から(Spectre/Meltdown攻撃を防ぐため)ブロックされるか、または厳重に難読化されています。その結果、公式のBasic Providerは実際にはWebGLで初期化されません。
WebAPのソリューション: 私たちは、Webの特性に特化したアプローチを設計しました。WebAPも FrameTimingManager を利用しますが、ブロックされたGPUタイマーに厳密に依存するのではなく、安全なヒューリスティック分析を使用します。ブラウザの異常(Emscriptenでの setTimeout によるメトリクスの歪みなど)を回避し、純粋な数学的計算によってボトルネック(CPU対GPU)を算出します。これにより、あらゆるブラウザで合法かつ安定して動作するAAAクラスの最適化システムが実現します。
なぜ標準的なスケーラースクリプトではないのか?
従来のソリューションでは、遅延の兆候が初めて現れたときに、単に画面解像度を下げるだけです。アプリケーションがレンダリングではなくCPUの計算(物理演算、スクリプト、ロジック)によってカクついている場合、これは無意味です。
WebAPの仕組み:
- ボトルネックの検出 (Bottleneck Detection)
プラグインは、フレームを制限しているのがCPUかGPUかを数学的に判断します。物理演算が遅延している場合、システムは画面解像度を下げずに物理演算を簡略化します。この目的のために、12個以上の独立したスケーラー(シャドウ、LOD、レイヤーカリングなど)が用意されています。 - アンチヨーヨー・ペナルティシステム (Anti Yo-Yo Penalty System)
品質のちらつき(Quality flickering)という、動的解像度における一般的な問題を解決します。グラフィックの向上が即座にFPSの低下を引き起こした場合、システムは一時的なペナルティロックアウト(Penalty Lockout)を実施し、さらなる向上をブロックします。 - UIの鮮明さを保持
RenderTextureを介したスケールモードを選択すると、3Dワールドの解像度は下がりますが、インターフェースはネイティブブラウザスケーリング(Native Browser Scaling)に維持されます。カスタムのWebScaledPhysicsRaycasterコンポーネントが光線の座標を自動的に再計算するため、フレームの圧縮に関係なく、3Dオブジェクトへのクリックは完璧に機能します。 - Zero-GC アーキテクチャ
プロジェクト全体は、厳格なメモリ節約を念頭に置いて設計されています。コアはO(1)のリングバッファを使用し、Updateループ内でのメモリ割り当て(アロケーション)を一切行いません。結果として、プラグインはガベージコレクタ(GC)を起動させません。 - 厳格なビルドのクリーンアップ
多くのアセットは、プレハブやテクスチャをResourcesフォルダに配置し(エンジンにビルドに強制的に含めさせ)、リリースビルドを肥大化させます。WebAPのアーキテクチャはこのエラーを回避します。シーンに明示的に追加されない限り、すべてのユーティリティとダッシュボードUIはコンパイル時に自動的に削除されます。軽量なコアだけが最終プロジェクトに到達します。 - プラグアンドプレイの統合
設定は Project Settings 内の統合されたインターフェースに集約されます。プラグインは自動的にビルドに注入されるため、マネージャープレハブをシーンに手動で配置する必要はありません。
互換性
- Unityバージョン:
2020.3 LTS以降。プラグインは最新のAPIを活用し、新しいエンジン機能(Unity 6000.2+以降のMesh LOD Thresholdサポートなど)を自動的に採用します。 - レンダーパイプライン: Built-in Render Pipeline (BiRP) と Universal Render Pipeline (URP) の両方を完全にサポートします。
