緩慢工作階段

在 Android Vitals 中,緩慢工作階段是指緩慢影格占比超過 25% 的工作階段。如果影格與前一個影格的間隔時間超過 50 毫秒 (相當於 20 FPS),就屬於緩慢影格。Android Vitals 也會回報第二個緩慢工作階段指標,目標為 34 毫秒 (相當於 30 FPS)。您可以透過緩慢工作階段,瞭解遊戲的影格率效能,這會影響使用者對遊戲流暢度的感受。

Play 會在適當情況下,開始減少顯示無法達到 20 FPS 的遊戲。請注意,遊戲執行一分鐘後,Android Vitals 才會開始監控影格率。

如要進一步瞭解這項指標,請造訪說明中心。

類似圓餅圖的圖表,顯示緩慢影格和非緩慢影格的數量。
圖 1. Android Vitals 中的緩慢工作階段。

如何測量每秒影格數及偵測緩慢影格

Android dumpsys SurfaceFlinger --timestats 指令會提供平均每秒影格數,以及所有轉譯圖層的顯示到顯示時間長條圖。影格的「顯示到顯示」時間,是指目前影格與上一個影格繪製之間的時間間隔。請按照下列步驟,使用指令收集遊戲的每秒影格數:

  1. 執行指令並加上 enable 和 clear 旗標,開始擷取資訊:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. 遊戲執行時間夠長後,請再次執行指令,並加上 dump 旗標,以傾印資訊:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    傾印的資訊會提供 SurfaceFlinger 算繪的所有圖層的總影格數和 presentToPresent 直方圖。您必須根據 layerName 篩選,找出遊戲所屬部分:

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    

    您可以根據每個圖層的資訊,計算工作階段的緩慢影格率。

    舉例來說,20 FPS 緩慢影格百分比 = (54 毫秒到 1000 毫秒的值總和) / totalFrames x 100

    totalFrames = 274
    ...
    presentToPresent histogram:
    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=1 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=269 34ms=0
    36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0
    66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 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=0
    

    傾印也會顯示每個圖層的平均每秒影格數:

    ...
    averageFPS = 30.179
    ...
    
  3. 收集完所有資訊後,請使用 disable 旗標停用 timestats:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

緩慢影格的原因和解決方案

影格在螢幕上顯示或算繪的時間可能比目標長,原因有很多。遊戲可能受 CPU 或 GPU 限制、裝置可能過熱並啟動節流熱狀態,或遊戲影格速率與裝置螢幕刷新率不符。

使用 Android Frame Pacing (Swappy)、Vulkan 和 ADPF 解決這些問題,並提升遊戲效能。

什麼是 Swappy

Android Frame Pacing 程式庫 (又稱為 Swappy) 是 AGDK 程式庫的一部分。Swappy 可讓 OpenGL 和 Vulkan 遊戲在 Android 裝置上流暢地呈現畫面,並修正影格同步情形。

「影格同步」是指遊戲的邏輯和算繪迴圈,與 OS 螢幕子系統和基礎顯示硬體的同步處理程序。Android 螢幕子系統經過特別設計,可避免可能發生在顯示硬體切換至新影格途中的瑕疵 (又稱為「撕裂」) 情形。為了避免出現這類瑕疵,螢幕子系統會執行以下操作:

  • 在內部為已通過的影格預留緩衝區。
  • 偵測延遲提交的影格。
  • 偵測到影格延遲時,重複顯示已通過的影格。

瞭解 Mir 2 如何使用 Swappy 將緩慢工作階段比率從 40% 降至 10%。

如何在原生專案中使用 Swappy

請參閱下列指南,將 Android Frame Pacing 程式庫整合至遊戲中:

如何在 Unity 遊戲引擎中使用 Swappy

Unity 已將 Android Frame Pacing 整合至引擎中。如要在 Unity 2019.2 以上版本中啟用這項功能,請依序前往「專案設定」>「Player」>「Settings」,然後在「Android」>「Resolution and Presentation」下方,勾選「Optimized Frame Pacing」核取方塊:

Unity 專案設定視窗,顯示「Optimized Frame Pacing」核取方塊。
圖 2. 在 Unity Engine 中啟用 Frame Pacing。

或者,您也可以在邏輯程式碼中,透過程式啟用最佳化影格同步速度選項,讓 Unity 平均分配影格,減少影格率差異,打造更流暢的遊戲體驗。

如何在 Unreal 遊戲引擎中使用 Swappy

Unreal 4.25 以上版本整合了 Android Frame Pacing 程式庫 (屬於 Android Game Development Kit 的一部分)。行動影格同步文章說明如何啟用 Android Frame Pacing 程式庫,以及如何透過 C++ 程式碼控制影格同步。

什麼是 Vulkan

Vulkan 是新型的跨平台 3D 圖形 API,旨在盡可能減少裝置圖形處理硬體與遊戲間的抽象化情形。Vulkan 是 Android 的主要低階圖形 API,可取代 OpenGL ES。Android 仍支援 OpenGL ES,但我們不再積極開發相關功能。

與 OpenGL ES 相較,Vulkan 具有下列優點:

  • 更有效率的架構,圖形驅動程式的 CPU 負擔較小
  • 全新的最佳化策略,可提升 CPU 效能
  • OpenGL ES 未提供的全新圖形處理功能,例如無繫結 API 和光線追蹤

如何在原生 Android 專案中使用 Vulkan

「開始在 Android 上使用 Vulkan」程式碼實驗室會引導您設定 Vulkan 算繪管道,然後在畫面上算繪帶有紋理的旋轉三角形。請參閱程式碼實驗室,瞭解如何算繪遊戲圖像。

如何在 Unity 遊戲引擎中使用 Vulkan

如要在 Unity 上啟用自動選取裝置功能,請按照步驟設定 Auto Graphics API。

Unity 專案設定視窗,已啟用自動圖形 API。
圖 3. 啟用 Unity Auto Graphics API。

或者,您也可以手動啟用 Vulkan,方法是停用「Auto Graphics API」,並將 Vulkan 設為「Graphics APIs」清單中的最高優先順序。如果您使用的是 Unity 2021.1 或更早版本,這是使用 Vulkan 的唯一方法。

Unity 專案設定視窗,其中 Vulkan 在圖形 API 清單中優先顯示。
圖 4. 在 Unity 中手動選擇 Vulkan 做為主要圖形 API。

使用 VkQuality Unity 引擎外掛程式,在啟動時為遊戲提供圖形 API 建議,以便在特定裝置上使用。

如何在 Unreal 遊戲引擎中使用 Vulkan

如要啟用 Vulkan 圖形 API,請依序前往「專案設定」>「Platforms」>「Android」>「Build」,然後選取「Support Vulkan」。如果同時選取「Support Vulkan」和「Support OpenGL ES3.2」,Unreal 預設會使用 Vulkan。如果裝置不支援 Vulkan,Unreal 會改用 OpenGL ES 3.2。

Unreal Engine 專案設定視窗,顯示「Support Vulkan」選項。
圖 5. 在 Unreal Engine 中啟用 Vulkan。

如果您使用的特定 Vulkan 功能在某些裝置上運作不佳,可以自訂 BaseDeviceProfile.ini 檔案,排除這些裝置。如要瞭解如何自訂 BaseDeviceProfile.ini,請參閱「自訂 Android 裝置設定檔和擴充性」。由於新的裝置驅動程式可能會修正先前已知的錯誤裝置,因此請更新 BaseDeviceProfile.ini 檔案,以取得所有最佳化功能。

什麼是 ADPF

Android 動態效能架構 (ADPF) 會根據 Android 的動態熱能、CPU 和 GPU 管理功能,對遊戲進行最佳化調整。本文說明重點在於遊戲,但您也可以將這些功能用於其他耗用大量效能的應用程式。

ADPF 是一組 API,可讓遊戲和需要耗用大量效能執行的應用程式直接與 Android 裝置的電力和熱溫系統互動。這些 API 可讓您監控 Android 系統的動態行為,並在不會使裝置過熱的永續等級最佳化遊戲效能。

以下是 ADPF 的主要功能:

  • Thermal API:監控裝置的溫度狀態,讓應用程式在無法維持永續等級前主動調整工作負載。
  • CPU Performance Hint API:提供效能提示,讓 Android 根據工作負載選擇合適的效能設定 (例如 CPU 運作點或核心)。
  • Game Mode API 和 Game State API:根據使用者設定和遊戲專屬設定,優先調整效能或電池續航力特性,提升遊戲體驗。
  • 固定效能模式:在基準化期間為裝置啟用固定效能模式,以取得非由動態 CPU 時脈變更的測量數據。
  • 省電模式:向工作階段指出,效能提示工作階段中的執行緒可以安全地排程,優先考量省電而非效能。適用於 Android 15 (API 級別 35)。

如何在原生 Android 專案中使用 ADPF

在原生遊戲中整合適應性功能程式碼實驗室會引導您將 ADPF 功能整合至遊戲,您可以按照自己的步調完成步驟。完成程式碼實驗室後,您將整合下列功能:

  • Thermal API:監聽裝置溫度,並在裝置進入溫度調節狀態前做出反應。
  • Game Mode API:瞭解玩家的最佳化偏好設定 (最大化效能或節省電池用量),並據此調整。
  • Game State API:讓系統瞭解遊戲狀態 (載入、遊玩、UI 等),系統就能據此調整資源 (提升 I/O、CPU、GPU 等)。
  • Performance Hint API:讓系統瞭解執行緒模型和工作負載,以便分配資源。

如何在 Unity 遊戲引擎中使用 ADPF

Unity 的 Adaptive Performance 是一款工具,可協助遊戲開發人員在行動裝置上最佳化遊戲,特別是針對多元的 Android 生態系統。Adaptive Performance 可讓遊戲即時適應裝置的效能和散熱特性,確保遊戲體驗流暢高效。

Adaptive Performance Android provider 會引導您在 Unity 中導入 ADPF。另請參閱「ADPF Unity Adaptive Performance 和 Android 供應商」。

Unity 專案設定視窗,顯示 Adaptive Performance Android 供應商設定。
圖 6. 在 Unity 引擎中整合 ADPF。

如何在 Unreal 遊戲引擎中使用 ADPF

Unreal Engine 外掛程式視窗,顯示 Android 動態效能框架外掛程式。
圖 7. 在 Unreal Engine 中整合 ADPF。
  1. 下載外掛程式。
  2. 將外掛程式複製到專案外掛程式資料夾。
  3. 在 Unreal 編輯器中啟用 ADPF Unreal Engine 外掛程式。
  4. 重新啟動 Unreal 編輯器。
  5. 建構及烹飪遊戲。

Unreal Engine 的 Android 動態效能框架 (ADPF) 外掛程式可提供穩定的效能,並防止熱溫調節。從 GitHub 下載外掛程式。這個外掛程式會設定 Unreal 控制台值來變更功能。詳情請參閱「ADPF Unreal Engine 外掛程式」。