平均 FPS
スムーズで安定したフレームレートは、Android デバイスで高品質なゲーム エクスペリエンスを実現するために不可欠です。ゲームのパフォーマンスを測定する際は、エクスペリエンスの基本的な理解を得るためのベースラインとして平均 FPS を測定する必要があります。優れたゲーム エクスペリエンスを実現するため、平均フレームレートが 60 FPS になるようにゲームを最適化する必要があります。
安定性のための P90 と P99 の FPS
平均 60 FPS でスムーズに動作するゲームでも、断続的なひっかかり、マイクロスタッタリング、予測不可能な入力遅延が発生し、プレーヤー エクスペリエンスが低下する可能性があります。
そのため、平均フレームレートのトラッキングと同様に、フレームの安定性も非常に重要です。ここでは、P90 と P99 のフレームレート指標をそれぞれ一貫したベースラインとスタッタリング指標として測定する必要があります。これらの指標は、プレーヤー エクスペリエンスの滑らかさを最適化するために、パフォーマンスの「末尾」を捉えます。
指標
- 平均 FPS(ベースライン): この基本的な指標は、ゲームのパフォーマンスの一般的なベースラインを示します。標準的なベンチマークではありますが、平均値の計算では断続的なフレーム落ちやマイクロスタッタリングを検出できないため、単独でプレーヤー エクスペリエンスを表すには不十分です。
- P90 FPS(10% パーセンタイルでの一貫したベースライン): フレームの 90% がこの一貫したベースラインを超え、レンダリングに時間がかかったのは最も遅い 10% のフレームのみであることを示します。P90 フレームレートが高く、平均に近い場合、セッションの大部分でゲームが安定して実行されていることを示します。
- P99 FPS(1% パーセンタイルでのカクつき指標): フレームの 99% がこのカクつき指標を超えていることを示します。最も遅い 1% のフレームを特定します。この指標は、マイクロスタッター、アセット読み込みの遅延、目に見えるヒッチの原因となるアセットの多いレンダリングの急激なスパイクを検出するために不可欠です。
例
平均 FPS を P90 指標および P99 指標と比較することで、ゲームの基盤となる動作を正確に診断できます。
シナリオ 1: 最適な曲線(最適化されたゲーム)
- 平均: 60 FPS(16.6 ミリ秒)
- P90: 58 FPS(17.2 ミリ秒)
- P99: 52 FPS(19.2 ミリ秒)
- 分析: 指標が密にクラスタ化されています。ゲームは非常にスムーズで一貫性があります。マイクロスタッターは発生せず、最悪の 1% のフレームでも人間の目にはほとんど認識できません。
シナリオ 2: 負荷のボトルネック(CPU/GPU バウンド)
- 平均: 45 FPS(22.2 ミリ秒)
- P90: 40 FPS(25.0 ミリ秒)
- P99: 38 FPS(26.3 ミリ秒)
- 分析: 平均フレームレートは低いですが、一貫しています。平均と比較して P99 が大幅に低下することはありません。これは、システムがグラフィック設定や解像度の制約によって過負荷状態になっていることを示します。ゲームがスタッタリングするのではなく、動作が遅く感じられます。グラフィック設定を下げると、通常、これらの指標は一様にスケールアップされます。
シナリオ 3: 60 FPS が不安定(シェーダー コンパイル / アセット ストリーミングのスタッター)
- 平均: 60 FPS(16.6 ミリ秒)
- P90: 45 FPS(22.2 ミリ秒)
- P99: 15 FPS(66.6 ミリ秒)
- 分析: これは最悪のシナリオです。平均フレームレートは良好に見えますが、P99 を見ると重大な問題が明らかになります。P99 が 66.6 ミリ秒の場合、ゲームが一度に複数のフレームで完全にフリーズしていることを意味します。これは、通常、CPU のボトルネック、アセット ストリーミングの遅延(RAM やストレージの速度が遅いなど)、シェーダー コンパイルによるヒッチングが原因で発生する、重大な外れ値を指します。
測定
平均 FPS、P90、P99 FPS を効果的に測定するには、次の 2 つの方法を使用できます。1 つ目の方法は、パフォーマンス プロファイリング ツールである Android Performance Analyzer(APA)を使用してシステム トレースを分析する方法です。2 つ目の方法は、既存の adb dumpsys SurfaceFlinger --timestats コマンドを使用する方法です。
1. APA を使用して測定する
APA を使用すると、システム トレースを記録し、SQL クエリを通じてフレームデータを正確に分析できます。指標を測定する手順は次のとおりです。
APA でトレースをキャプチャする: ゲームを実行し、APA を使用して、分析するセグメント(フレーム落ちが疑われるゲームプレイ中のポイントなど)のシステム トレースをキャプチャします。デバイスが接続され、トレースの記録が完了すると、トレースデータが APA インターフェースに読み込まれます。
トレース キャプチャ画面または読み込まれたトレース画面 APA で [SQL] タブをクリックする: トレース分析画面が開いたら、UI の上部またはサイド ナビゲーション領域にある [SQL] タブをクリックして、トレース プロセッサ環境を開きます。この環境では、データを直接クエリできます。
APA SQL タブに SQL クエリを貼り付ける: 次の SQL クエリをコピーして、クエリ入力フィールドに貼り付けます。このクエリは、SurfaceFlinger プロセスを特定し、実際のディスプレイ更新タイムスタンプに基づいてフレーム間隔を計算し、平均 FPS、下位 10%(P90)の FPS、下位 1%(P99)の FPS を導出します。
WITH target_process AS ( -- 1. Get SurfaceFlinger process ID where frames were identified in debugging step 3 SELECT upid FROM process WHERE name = '/system/bin/surfaceflinger' ), actual_present_times AS ( -- 2. Calculate the hardware display timestamps when SurfaceFlinger actually updated the screen SELECT (ts + dur) AS present_ts FROM actual_frame_timeline_slice WHERE upid IN (SELECT upid FROM target_process) AND dur > 0 ), present_intervals AS ( -- 3. Calculate intervals between physical screen refreshes SELECT (LEAD(present_ts) OVER (ORDER BY present_ts ASC) - present_ts) / 1000000.0 AS p2p_ms FROM actual_present_times ), valid_intervals AS ( -- 4. Filter for valid frame intervals SELECT p2p_ms FROM present_intervals WHERE p2p_ms IS NOT NULL AND p2p_ms > 0 ), ordered_frames AS ( -- 5. Sort in ascending order to calculate percentiles SELECT p2p_ms, ROW_NUMBER() OVER (ORDER BY p2p_ms ASC) AS row_num, COUNT(1) OVER () AS total_frames FROM valid_intervals ) -- 6. Output final metrics SELECT (SELECT COUNT(1) FROM valid_intervals) AS total_presented_frames, ROUND(1000.0 / NULLIF((SELECT AVG(p2p_ms) FROM valid_intervals), 0), 2) AS average_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.90 AS INT)), 0), 2) AS low_10_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.99 AS INT)), 0), 2) AS low_1_fps;[クエリを実行] をクリック: クエリ入力フィールドの近くにある [クエリを実行] ボタン(または実行アイコン)をクリックします。クエリの実行が完了すると、測定された合計フレーム数(
total_presented_frames)、平均フレームレート(average_fps)、下位 10% の FPS(low_10_fps)、下位 1% の FPS(low_1_fps)が結果ペインの表に表示されます。
実行された SQL クエリと、テーブルに表示された 4 つの結果指標を示す画面
2. adb を使用して測定する(dumpsys SurfaceFlinger)
平均 FPS、P90、P99 を効果的に測定するには、Android の dumpsys surfaceflinger timestats コマンドを使用します。このツールは、レンダリングされているすべてのレイヤの平均 FPS と presentToPresent タイミング ヒストグラムを提供します。フレームの presentToPresent 時間は、現在のフレームと描画されている前のフレームの間隔です。
ゲームのこれらの指標を収集して計算する手順は次のとおりです。
キャプチャを開始する: enable フラグと clear フラグを指定して次のコマンドを実行し、情報のキャプチャを開始します。
adb shell dumpsys SurfaceFlinger --timestats -clear -enable情報をダンプする: ゲームを十分にプレイしたら、ダンプ フラグを指定してコマンドを再度実行し、情報を出力します。
adb shell dumpsys SurfaceFlinger --timestats -dumpレイヤでフィルタ: ダンプされた情報には、SurfaceFlinger によってレンダリングされたすべてのレイヤのデータが含まれます。
layerName(layerName = SurfaceView[com.example.yourgame...] など)に基づいてフィルタリングし、ゲームに対応するセクションを見つける必要があります。layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833平均 FPS を特定する: 各レイヤの平均 FPS が自動的に計算され、ダンプ出力に直接表示されます(例: averageFPS = 30.179)。
... averageFPS = 30.179 ...P90 と P99 の FPS を計算する: P90 と P99 の指標を求めるには、ダンプで提供される totalFrames と
presentToPresentタイミング ヒストグラムを分析する必要があります。totalFrames = 1000 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0A. 概念的な例(累積分布表)ゲーム セッションで totalFrames のカウントが 1,000 と記録されたとします。P90 と P99 を求めるには、ミリ秒の最小バケットからカウントアップして、累積フレーム数がそれぞれ 900 フレーム(90%)と 990 フレーム(99%)に達するミリ秒のしきい値を計算します。
フレーム時間(ミリ秒) フレーム数(ヒストグラム) 累積フレーム数 パーセンタイルのステータス / 計算 16 ミリ秒 850 850 85.0% 33 ミリ秒 100 950 95.0%
(P90 目標の 900 を達成!→ 1,000/33 = 30.3 FPS)50 ミリ秒 35 985 98.5% 66 ミリ秒 10 995 99.5%
(P99 の目標値 990 を達成しました。→ 1000/66 = 15.1 FPS)102 ミリ秒 5 1,000 100% B. 実装ロジック(疑似コード) Python スクリプトまたはログパーサーを使用してこの分析を自動化する場合は、ヒストグラムから P90 値と P99 値を抽出するロジックを次のように実装できます。
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are foundキャプチャを停止する: 必要な情報をすべて収集したら、無効フラグを使用して timestats を無効にする必要があります。
adb shell dumpsys SurfaceFlinger --timestats -disable
速度の遅いセッション
Slow Sessions は、現実世界で広範囲にわたるパフォーマンスの問題を特定します。25% を超えるフレームがしきい値(20 FPS など)を下回る場合、セッションは「遅い」と見なされます。この指標は、重大なビルドの問題を特定するのに役立ちますが、この指標だけでは高品質で持続可能なエクスペリエンスを保証することはできません。ゲームがスロー セッションのしきい値を回避しても、60 FPS のスムーズなエクスペリエンスを損なうマイクロスタッタリングが発生する可能性があります。
どちらもフレーム時間から導き出されますが、「遅いセッション」と「フレームレート」は異なる役割を果たします。平均、P90、P99 の FPS 指標は、パフォーマンスの品質と持続可能性を測定し、速度が遅いセッションの指標では見落とされる可能性のある、瞬間的な低下や一貫性のないペースを検出します。
まとめ
パフォーマンスの最適化を成功させるには、包括的な戦略が必要です。デベロッパーは、パフォーマンスの著しい低下を検出する主要なレーダーとして低速セッションを使用し、平均 FPS、P90、P99 を調べて根本原因を診断し、ゲームプレイの実際の滑らかさを確認する必要があります。これらの指標を統合することで、アプリケーションが持続可能で優れたユーザー エクスペリエンスを一貫して提供できるようになります。
参考情報
高度なプロファイリング手法、Frame Pacing API の実装、エンジン固有の最適化戦略について詳しくは、Android デベロッパーの公式ドキュメントをご覧ください。
- Android Vitals: 速度が遅いセッション: ユーザー エクスペリエンスに直接影響するレンダリングの遅延が、Google Play でどのように測定され、レポートに表示されるかを把握します。「速度の遅いセッション」とは、25% を超えるフレームの速度が遅い(50 ミリ秒以上、20 FPS 相当など)ユーザー セッションのことです。
- Android デベロッパー: ゲームのパフォーマンスを最適化する: Android ゲームの最適化に関する中心的なハブをご覧ください。この包括的なガイドでは、ゲームの全体的なパフォーマンスを最大限に高めるためのベスト プラクティスや、プロファイリング ツール(APA や Perfetto など)について説明しています。