管理 Android 裝置的功耗和效能有助於確保應用程式在各種硬體上一致、流暢地運作。在 Android 7.0 及更高版本中,OEM 可實現對持續效能提示的支持,使應用程式能夠保持一致的裝置效能,並指定專用核心來提高 CPU 密集型前台應用程式的效能。
持續表現
對於長時間運行的應用程式(遊戲、相機、 RenderScript 、音訊處理),當達到裝置溫度限制且系統單晶片 (SoC) 引擎受到限制時,效能可能會發生巨大變化。創建高效能、長時間運行的應用程式的應用程式開發人員受到限制,因為當設備開始升溫時,底層平台的功能是一個不斷變化的目標。
為了解決這些限制,Android 7.0 引入了對持續性能的支持,使 OEM 能夠為長時間運行的應用程式提供有關設備性能功能的提示。應用程式開發人員可以使用這些提示來調整應用程序,以實現長時間內可預測、一致的設備效能等級。
建築學
Android 應用程式可以要求平台進入持續效能模式,在該模式下,Android 裝置可以長時間保持一致的效能水準。
執行
為了支援 Android 7.0 及更高版本的持續效能,OEM 必須:
- 對電源 HAL 進行特定於設備的更改,以鎖定最大 CPU/GPU 頻率或執行其他最佳化以防止熱節流。
- 在 power HAL 中實作新提示
POWER_HINT_SUSTAINED_PERFORMANCE
。 - 透過
isSustainedPerformanceModeSupported()
API 傳回 TRUE 來宣告支援。 - 實作
Window.setSustainedPerformanceMode
。
在 Nexus 參考實作中,電源提示將 CPU 和 GPU 的最大頻率限制在最高可持續水準。請記住,降低 CPU/GPU 頻率的 MAX 條會降低幀速率,但由於其可持續性,這種較低的速率在此模式中是首選。例如,使用正常最大時鐘的設備可能能夠以 60 FPS 的速度渲染幾分鐘,但在設備升溫後,它可能會在 30 分鐘結束時降至 30 FPS。例如,使用持續模式時,設備可以在整個 30 分鐘內以 45 FPS 的速度持續渲染。目標是使用該模式時的幀速率與不使用該模式時的幀速率一樣高(或更高),並且隨著時間的推移保持一致,以便開發人員不必追逐移動目標。
我們強烈建議實施持續模式,以便設備實現盡可能最高的持續性能,而不僅僅是通過測試所需的最小值(例如,選擇盡可能最高的最大頻率上限,這樣不會導致設備隨著時間的推移而產生熱限制)。
注意:實現持續模式不需要限制最大時脈速率。
驗證
OEM 可以使用 CTS 測試(Android 7.0 及更高版本)來驗證其對持續效能 API 的實作。此測試運行工作負載約 30 分鐘,並對啟用和不啟用持續模式的效能進行基準測試:
- 啟用持續模式後,幀速率必須保持相對恆定(測試測量幀速率隨時間變化的百分比,並要求變化 <5%)。
- 啟用持續模式時,幀速率不得低於停用該模式時 30 分鐘結束時的幀速率。
此外,您可以使用多個 CPU 和 GPU 密集型工作負載手動測試您的實作,以確保裝置在使用 30 分鐘後不會出現熱限制。在內部測試中,我們使用了範例工作負載,包括遊戲和基準測試應用程式(例如gfxbench )。
獨家核心
對於 CPU 密集、時間敏感的工作負載,被另一個執行緒搶佔可能是是否達到幀截止時間的差異。對於對延遲和幀速率有嚴格要求的應用程式(例如音訊或虛擬實境應用程式),擁有專用的 CPU 核心可以保證可接受的效能等級。
運行Android 7.0 或更高版本的裝置現在可以為頂級前台應用程式明確保留一個核心,從而提高所有前台應用程式的效能,並使具有高強度工作負載的應用程式更好地控制其工作在CPU 核心之間的分配方式。
要支援設備上的獨佔核心:
- 啟用
cpusets
並配置僅包含頂級前台應用程式的cpuset
。 - 確保為該
cpuset
中的執行緒保留一個核心(這是獨佔核心)。 - 實作 getExclusiveCores API 以傳回獨佔核心的核心編號。
若要確定哪些進程調度在哪些核心上,請在執行任何工作負載時使用systrace
,並驗證除頂級前台應用程式之外的應用程式中沒有使用者空間執行緒調度在獨佔核心上。
要查看 Nexus 6P 的參考實現,請參閱android//device/huawei/angler/power/power.c
。