緩慢工作階段 (僅限遊戲)

緩慢工作階段是 Google Play 管理中心的新 Android Vitals 指標。緩慢的工作階段是指緩慢影格比率超過 25% 的工作階段,如果影格在前一個影格後 50 毫秒內未顯示 (相當於 20 FPS),就屬於緩慢影格。Android Vitals 也會回報第二個緩慢工作階段指標,目標為 34 毫秒 (等同於 30 FPS)。緩慢工作階段資料可以協助您掌握遊戲的影格速率效能,從而得知使用者是否獲得流暢的遊戲體驗。

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

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

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

如何評估 FPS 和偵測緩慢影格

Android dumpsys surfaceflinger timestats 指令會針對所有正在算繪的圖層,提供平均 FPS 和 present 到 present 的時間軸。影格顯示到顯示時間,是指目前影格與繪製的前一影格之間的間隔。以下是使用指令收集遊戲 FPS 的逐步步驟:

  1. 搭配 enableclear 旗標執行指令,即可開始擷取資訊:

    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 毫秒的值總和) / 總影格數 x 100

    totalFrames = 274
    ...
    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=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
    

    每個圖層的平均 FPS 也會顯示在轉儲中:

    ...
    averageFPS = 30.179
    ...
    
  3. 收集所有資訊後,請使用標記 disable 停用時間統計資料:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

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

有許多原因可能導致畫面顯示或算繪時間比開發人員設定的目標時間長。遊戲可能受到 CPU/GPU 限制。或者,裝置過熱並啟動熱力限制狀態。或者遊戲的幀率與裝置的螢幕更新率不符

請使用 Android Frame Pacing (Swappy)VulkanADPF 解決這些問題,並改善遊戲效能。

什麼是 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 以上版本中啟用這項功能,請依序前往「Project Settings」>「Player」>「Settings」,然後勾選「Android」>「Resolution and Presentation」下方的「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 的設定步驟操作。

專案設定對話方塊。
圖 3 啟用 Unity Auto Graphics API。

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

專案設定對話方塊。
圖 4. 在 Unity 中手動選擇 Vulkan 做為主要圖形 API。

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

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

如要啟用 Vulkan 圖像 API,請依序前往「Project Settings」>「Platforms」>「Android」>「Build」,然後選取「Support Vulkan」。當您同時選取「支援 Vulkan」和「支援 OpenGL ES 3.2」時,Unreal 預設會使用 Vulkan。如果裝置不支援 Vulkan,Unreal 會改用 OpenGL ES 3.2。

專案設定對話方塊。
圖 5. 在 Unreal Engine 中啟用 Vulkan。

如果您使用的特定 Vulkan 功能已知會在特定裝置上發生問題,您可以自訂 BaseDeviceProfile.ini 檔案,排除這些裝置。請參閱「自訂 Android 裝置設定檔和可擴充性」,瞭解如何自訂 BaseDeviceProfile.ini。新的裝置驅動程式可能會修正先前已知的故障裝置,因此請持續更新 BaseDeviceProfile.ini 檔案,以便取得所有最佳化功能。

什麼是 ADPF

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

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

以下是 ADPF 的主要功能:

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

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

在原生遊戲中整合適應性功能程式碼研究室會引導您按照自己的步調,將 ADPF 功能整合到遊戲中。完成本程式碼研究室後,您將會整合下列功能:

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

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

Unity 的 Adaptive Performance 是專為遊戲開發人員打造的工具,可協助他們針對行動裝置 (尤其是多元化的 Android 生態系統) 最佳化遊戲。透過適應性效能功能,遊戲就能即時調整裝置的效能和熱力特性,確保提供順暢且有效率的遊戲體驗。

Adaptive Performance Android 供應器 會引導您逐步完成在 Unity 中導入 ADPF 的程序。

專案設定對話方塊。
圖 6. 在 Unity Engine 中整合 ADPF。

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

專案設定對話方塊。
圖 7. 在 Unreal Engine 中整合 ADPF。
  1. 下載外掛程式
  2. 將外掛程式複製到專案外掛程式資料夾
  3. 在 Unreal 編輯器中啟用 ADPF Unreal Engine 外掛程式
  4. 重新啟動 Unreal 編輯器
  5. 建構及烹飪遊戲

Unreal Engine 適用的 Android 動態效能架構(ADPF) 外掛程式可提供穩定的效能,並防止熱量節流。從 GitHub 下載外掛程式。這個外掛程式會透過設定 Unreal 主控台值來變更功能。