ゲームのパフォーマンスを分析して最適化する

このガイドでは、Android デバイスでゲームのパフォーマンスを分析して最適化し、スムーズなユーザー エクスペリエンスを実現するプロセスについて説明します。パフォーマンスのボトルネックの特定、CPU と GPU の問題の区別、最適化結果の検証について説明します。

ゲームがどれほど楽しく魅力的であっても、モバイル デバイスでうまく動作しなければ、プレーヤーは楽しめず、成功も望めません。楽しいゲームでも、フレーム/秒(FPS)が低い、デバイスが熱くなりすぎるなどの問題が発生することがあります。これらの問題はプレーヤーの不満につながります。そのため、ゲームのパフォーマンスを改善することは不可欠であり、最適化の方法を理解する必要があります。

パフォーマンス最適化のプロセスには、次の手順が含まれます。

  1. ゲーム全体のパフォーマンスを測定します。シーンごとにパフォーマンスの低下を数値化して、異常を特定します。

  2. CPU と GPU のバウンド チェック。CPU の制約を受けるか GPU の制約を受けるかなど、根本原因を特定します。

    ツール: Unreal Insight、Unity Profiler、Perfetto、パフォーマンス測定ツール。

  3. CPU の最適化。特定されたパフォーマンスのボトルネックを修正します。

    ツール: Unreal Insight、Unity Profiler、Perfetto、Simpleperf。

  4. GPU の最適化。特定されたパフォーマンスのボトルネックを修正します。

    ツール: RenderDoc、Arm mobile studio、AGI、ベンダー固有のツール。

  5. A/B テスト。A/B テストを実施して、実装された最適化の有効性を厳密に検証します。

    ツール: Unreal Insight、Unity Profiler、Perfetto、パフォーマンス測定ツール、CPU または GPU の周波数ロック、RenderDoc。

  6. この反復プロセス(1 ~ 5)は、目標の FPS と温度パラメータが達成されるまで維持されます。

前提条件

ゲームのパフォーマンスを包括的に分析する

ゲームの全体的なパフォーマンスを確認し、シーンベースのパフォーマンスの低下や異常を特定する必要があります。ゲームを最適化する前に、現在のパフォーマンスを確認します。ゲームには多くの UI とシーンが含まれているため、CPU または GPU の使用率が高いシーンや、予期しない動作をするレイアウトを分析して、シーンごとのパフォーマンスの低下と CPU または GPU の使用率をモニタリングします。

  1. パフォーマンスの低下を定量化する: パフォーマンス測定ツールを使用して、ゲームの全体的なパフォーマンスを測定します。シーンごとにパフォーマンスを測定して、劣化や異常が発生している特定の領域を特定します。
  2. 問題のあるシーンを特定する: データを分析して、CPU または GPU の使用率が高いシーンや、画面レイアウトで期待されるパフォーマンスが得られないシーンを見つけます。
  3. トレースデータを収集する: トレースツールを使用して、特定された問題のあるシーンの詳細なパフォーマンス データを収集します。

CPU または GPU のボトルネックを特定する

ゲームが目標 FPS に達していない場合は、CPU バウンドか GPU バウンドかを判断します。ゲームプレイ中にデバイスが熱くなったり、電力を過剰に消費したりする場合でも、CPU と GPU の動作を分析することは、最適化の機会を見つけるうえで非常に重要です。さまざまな方法で、システムが CPU バウンドか GPU バウンドかを調べることができます。

  1. トレースデータを分析する: 任意のツールを使用してトレースデータを分析します。

    • Unreal Insight(Unreal Engine): トレースを分析して、GameThreadRenderThreadRHIThread のタイミングを確認します。
      • GameThread または RenderThread がフレーム時間の上限(30 FPS の場合は 33.3 ミリ秒など)を超えている場合、ゲームは CPU 基準です。
      • RHIThread の実行時間が長い場合や、フレーム時間の大部分を占めている場合、ゲームは GPU バウンドです。
    GameThread、RenderThread、RHIThread の実行時間を示す Unreal Insight トレース タイムライン
    図 2. GameThread、RenderThread、RHIThread を含む Unreal のインサイト トレース(クリックして拡大)。
    • Unity Profiler(Unity): レンダリング スレッドが Gfx.PresentFrame または <GraphicsAPIName>.WaitForLastPresent を示しているときに、メインスレッドが Gfx.WaitForPresentOnGfxThread などのマーカーでかなりの時間を消費している場合、ゲームは GPU バウンドです。
    Gfx.WaitForPresentOnGfxThread で待機しているメインスレッドを示す Unity Profiler タイムライン
    図 3. Unity Profiler の GPU バウンドの例(クリックして拡大)。
    • Perfetto: CPU コアの割り当てとスレッドの実行の詳細を分析します。この分析により、スレッド実行情報の詳細なレビューを通じて、パフォーマンスのボトルネックを特定できます。
    • CPU オーバーヘッド: トレースは、GameThreadRenderThread のワークロードが VSync と連携して RHI スレッドの QueuePresent の遅延の原因となっていることを示しています。これは CPU バウンドのシナリオを示しています。

      GameThread、RenderThread、RHIThread の実行時間を示す Perfetto トレース
      図 4. CPU 実行の詳細を含む Perfetto トレース(クリックして拡大)。
    • GPU オーバーヘッド: GPU の完了時間がフレーム時間の上限(25 ミリ秒など)を超えると、ゲームは GPU バウンドになります。トレースは、GPU の完了が 25 ミリ秒を超えていることを示しています。これは、GPU バウンドのシナリオを示しています。

      GPU の完了を待機している GPU 完了ブロックを示す Perfetto トレース
      図 5. GPU オーバーヘッドの詳細を含む Perfetto トレース(クリックして拡大)。
  2. Unreal Engine の stat コマンドを使用する:

    • stat unit: ゲーム、描画、RHI スレッドに割り当てられた時間を比較します。ゲーム時間と描画時間が短いにもかかわらず、RHI 時間がフレーム時間の上限を常に超えている場合、ゲームは GPU バウンドです。たとえば、必要な FPS が 30(フレームあたり 33.33 ミリ秒に相当)で、ゲーム スレッドと描画スレッドの両方が常に 10 ~ 15 ミリ秒の範囲内にとどまっているにもかかわらず、RHI が常に 30 ミリ秒を超えている場合は、GPU バウンドのシナリオである可能性が非常に高くなります。
    フレーム、ゲーム、描画、GPU、RHIT の実行時間を表示する統計単位オーバーレイ
    図 6. Stat ユニットは、GPU バウンド条件の推定を容易にします。
    • stat VulkanRHI: キューの送信とキューの表示の所要時間を確認します。
    Queue Submit と Queue Present のサイクル カウンタを表示する Stat VulkanRHI オーバーレイ
    図 7. Stat VulkanRHI は、GPU バウンド条件の推定を容易にします(クリックして拡大)。
    • stat slow: ゲーム、レンダリング、RHI スレッドに割り当てられた時間を精査して、障害を特定します。
  3. パフォーマンス指標を確認する: ゲームのパフォーマンスの包括的な分析の結果を使用します。Android の場合

    • CPU バウンド: CPU(正規化済み)使用率が 15% を超え、GPU 使用率と FPS が低い。
    • GPU バウンド: GPU 使用率が 90% を超えています。

    通常、CPU 使用率が 15% を超えているにもかかわらず、FPS と GPU 使用率が低い場合は、CPU バウンドと見なすことができます。

    CPU バウンドと GPU バウンドのシナリオをハイライト表示したパフォーマンス指標の表
    図 8. CPU と GPU の使用率を示すパフォーマンス指標。

CPU パフォーマンスを最適化する

分析でゲームが CPU バウンドであることが示された場合は、ボトルネックの原因となっている特定のスレッドや API を特定するために、さらに調査します。

詳細なガイダンスについては、Android 向け CPU、GPU 最適化のヒントをご覧ください。

GPU パフォーマンスを最適化する

分析でゲームが GPU バウンドであることが示された場合は、フレーム デバッガを使用してレンダリング パイプラインとドローコールを分析し、さらに調査します。

詳細なガイダンスについては、Android 向け CPU、GPU 最適化のヒントをご覧ください。

最適化の効果を検証する

  1. A/B テストを実施する: 実装された最適化を含むビルドを作成します。
  2. パフォーマンスを測定する: 最適化されたビルドのパフォーマンスを測定するには、最初の分析と同じツールと方法を使用します。
  3. 結果を比較する: 新しいパフォーマンス データを初期データと比較して、特定されたボトルネックが解消され、FPS と温度の目標が達成されたことを確認します。
  4. 反復: パフォーマンスが達成されるまで、分析と最適化の手順を繰り返します。

関連ドキュメント