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

「緩慢工作階段」是 Google Play 管理中心新推出的 Android Vitals 指標。緩慢工作階段指的是超過 25% 影格的緩慢工作階段。若是在前一個影格 (等於 20 FPS) 沒有在 50 毫秒內顯示影格,就是緩慢的影格。Android Vitals 也會回報第二個緩慢工作階段指標,目標為 34 毫秒 (相當於 30 FPS)。您可以透過緩慢工作階段瞭解遊戲的影格速率效能,這會影響遊戲為使用者提供的流暢和順暢度。

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

如要進一步瞭解指標,請前往說明中心

圓餅圖類似圖形,可呈現緩慢影格和未緩慢影格的數量。
圖 1. Android Vitals 中的緩慢工作階段。

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

Android dumpsys surfaceflinger timestats 指令會為正在轉譯的所有圖層提供平均 FPS 和「可顯示」時間直方圖。影格的「顯示時間」是指目前影格和前一個影格繪製的間隔時間。請按照下列步驟使用指令收集遊戲的每秒影格數:

  1. 執行具有 enableclear 旗標的指令,即可開始擷取資訊:

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

    adb shell dumpsys SurfaceFlinger --timestats -dump
    

    傾印資訊會提供影格總數,並針對 SurfaceFlinger 轉譯的所有圖層提供呈現的色階分佈圖。您必須根據 layerName 篩選,才能找到遊戲的區段

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

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

    例如,20 FPS 緩慢影格百分比 = (54 毫秒到 1000 毫秒的值總和) / totalFrames 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
    

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

    ...
    averageFPS = 30.179
    ...
    
  3. 收集所有資訊後,您應使用標記 disable 停用 timestats:

    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 螢幕子系統經過特別設計,可避免可能發生在顯示硬體切換至新影格途中的瑕疵 (也稱為撕裂) 情形。為了避免出現這類瑕疵,螢幕子系統會執行以下操作:

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

如何在原生專案中使用 Swappy

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

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

Unity 已將 Android Frame Pacing 整合至自家引擎。如要在 Unity 2019.2 以上版本中啟用這項功能,請在「Android」>「Resolution and Presentation」下方,勾選「Project Settings」>「Player」>「Settings」下方的「Optimized Frame Pacing」核取方塊:

專案設定對話方塊。
圖 2. 在 Unity Engine 中啟用 Frame Pacing。

或者,您也可以透過程式輔助方式,在邏輯程式碼中啟用「Optimized Frame Pacing 選項」,讓 Unity 平均分配影格以減少畫面更新率的變化,讓遊戲過程更順暢。

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

Unreal 4.25 以上版本整合了 Android Frame Pacing 程式庫 (這是 Android Game Development Kit 的一部分)。Mobile Frame Pacing 一文會說明如何啟用 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 API」清單中最高。如果您使用 Unity 2021.1 或先前版本,這是使用 Vulkan 的唯一方法。

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

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

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

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

專案設定對話方塊。
圖 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 leve 35)。

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

在原生遊戲中整合適應性功能」程式碼研究室會引導您按照自己的步調,將 ADPF 功能整合至遊戲中。程式碼研究室結束時,您將整合了下列功能:

  • 熱能 API:監聽裝置熱力狀況,並在裝置進入過熱保護狀態前做出回應。
  • Game Mode API:瞭解玩家最佳化偏好設定 (最大化效能或節省電力),並據此進行調整。
  • Game State API:讓系統瞭解遊戲狀態 (載入、播放、UI 等),系統就能據此調整資源 (加強 I/O、CPU、GPU 等)。
  • Performance Hint API:告知系統您的執行緒模型和工作負載,讓系統據此分配資源。

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

Unity 的自動調整效能這項工具適用於希望在行動裝置上最佳化遊戲的遊戲開發人員,尤其是各種 Android 生態系統。自動調整效能可讓遊戲即時根據裝置的效能和熱力特徵進行調整,確保提供流暢又有效率的遊戲體驗。

自動調整效能 Android 供應商會逐步引導您在 Unity 中實作 ADPF。

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

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

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

Unreal EngineAndroid 動態效能架構(ADPF) 外掛程式提供穩定效能,並避免過熱保護。從 GitHub 下載外掛程式。這個外掛程式會藉由設定 Unreal 主控台值來變更功能。