平均每秒影格數
流暢穩定的影格率是 Android 裝置提供優質遊戲體驗的關鍵。評估遊戲效能時,您應將平均 FPS 設為基準,以便初步瞭解遊戲體驗。請將遊戲最佳化,達到平均每秒 60 個影格率,確保提供優質的遊戲體驗。
穩定性 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,可以使用 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 已達成!→ 1000/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停止擷取:收集所有必要資訊後,您應使用停用標記停用時間統計資料:
adb shell dumpsys SurfaceFlinger --timestats -disable
緩慢工作階段
緩慢工作階段可找出普遍的實際效能問題。如果超過 25% 的影格低於門檻 (例如 20 FPS),工作階段就會「緩慢」。雖然這項指標有助於找出重大建構問題,但單靠這項指標無法保證提供高品質的永續體驗。遊戲可能避開「工作階段緩慢」門檻,但仍會出現微幅延遲,導致無法順暢地以 60 FPS 體驗遊戲。
雖然「緩慢工作階段」和「影格速率」都是從影格時間衍生而來,但兩者扮演的角色不同。平均、P90 和 P99 FPS 指標可評估效能品質和持續性,偵測緩慢工作階段指標可能忽略的瞬間下降和不一致的步調。
結論
如要成功最佳化成效,必須採取全方位的策略。開發人員應將「緩慢的工作階段」做為主要雷達,以掌握嚴重效能下降情形,然後檢查平均每秒影格數、P90 和 P99,診斷根本原因並驗證實際遊戲流暢度。整合這些指標後,即可確保應用程式持續提供優質的使用者體驗。
其他資源
如要進一步瞭解進階剖析技術、如何導入 Frame Pacing API,以及引擎專屬最佳化策略,請參閱 Android 開發人員官方說明文件:
- Android Vitals:緩慢工作階段:瞭解 Google Play 如何評估及回報持續的轉譯速度緩慢,這會直接影響使用者體驗。「緩慢工作階段」是指緩慢影格占比超過 25% 的使用者工作階段 (例如超過 50 毫秒,相當於 20 FPS)。
- Android 開發人員:提升遊戲效能:探索 Android 遊戲最佳化的中心樞紐。這份完整指南涵蓋最佳做法、剖析工具 (例如 AGI 和 Perfetto),可協助您盡量提升遊戲整體效能。