Skip to content

はじめに

Web Adaptive Performance (WebAP) は、Unity WebGLアプリケーションの動的最適化ツールです。

強力なPCから性能の低いスマートフォンまで、幅広いデバイスにわたって、視覚的な品質と安定したFPSのバランスを見つけるのに役立ちます。固定された制限に依存するのではなく、プラグインはフレームタイミングをリアルタイムで分析します。パフォーマンス低下の根本原因を特定し、安定するまでスムーズに負荷を軽減し、パフォーマンスの余裕(Performance Headroom)が得られれば品質を回復させます。

デバイスへの適応

デフォルトでは、Unityプロジェクトを最大品質設定で構成してください。現在のデバイスがその負荷を処理できない場合、プラグインは実行時(Runtime)に自動的に負荷を軽減します。

なぜWebAPを選ぶのか?

公式のAdaptive Performanceパッケージではない理由は?
公式のUnityパッケージは強力なツールですが、WebGLとは根本的に互換性がありません。これは2種類のプロバイダーに依存しており、どちらもブラウザの制限によって阻害されます。

  1. ネイティブプロバイダー (Android): 熱データを取得し、周波数を管理するためにシステムAPIに依存しています。ブラウザのサンドボックスはハードウェアへのすべてのアクセスをブロックするため、このアプローチは不可能です。新しいWeb標準(Compute Pressure APIなど)はCPUのみを監視し、3Dグラフィックスに関する正確なデータを提供しません。
  2. 基本プロバイダー (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) の両方を完全にサポートします。