Android 11 開始支援採用多種刷新率的裝置。這項功能有三個主要元件:
- 我們在
android.hardware.graphics.composer@2.4
。 - 剖析裝置設定以不同刷新率和 設定所需的重新整理頻率
- 新的 SDK 和 NDK API,可讓應用程式設定所需的影格速率
實作
android.hardware.graphics.composer@2.4 HAL
已新增專屬的刷新率切換支援功能。強烈建議您使用舊版
Composer HAL 只對重新整理頻率切換提供有限支援。
設定群組
已在以下位置新增屬性 CONFIG_GROUP
:
IComposerClient::Attribute
可以使用
getDisplayAttribute_2_4
API。這項屬性可讓供應商將顯示設定分組。同一個群組中的設定
就能在大多數的情況下輕鬆切換這個配置群組
以便區分哪些設定可以切換
才切換重新整理頻率
設定檔。
請參考以下範例,瞭解使用設定的優點 群組,以及可支援以下四種顯示設定的裝置:
- 1080p@60Hz
- 1080p@90Hz
- 1080i@72Hz
- 1080i@48Hz
雖然裝置支援 48Hz、60Hz、72Hz 和 90Hz 刷新率 螢幕在不同模式下運作,從 60Hz 切換為 72Hz 的模式, 顯示設定從 1080p 到 1080i,這可能不是您想要的行為。 您可以使用配置群組解決這個問題。將 60Hz 和 90Hz 歸入同一個設定群組,而 48Hz 和 72Hz 則歸入另一個設定群組。平台知道 可以在 60Hz 和 90Hz 間切換,在 48 和 72 Hz 間切換,但不提供 60Hz 和 72Hz 的刷新率會讓設定發生變化,而不是只是 重新整理頻率
Composer API 更新
- getDisplayVsyncPeriod
- 在變更刷新率時,有利於掌控度和可預測性
已新增
getDisplayVsyncPeriod
。getDisplayVsyncPeriod
會傳回螢幕目前的刷新率 (以 vsync 週期為準)。這個做法特別實用 唯有採用重新整理頻率, 決定啟動下一個影格的時機 - setActiveConfigWithConstraints
setActiveConfigWithConstraints
方法是現有setActiveConfig
方法的新擴充功能,可提供更多設定變更資訊。限制條件會提供為vsyncPeriodChangeConstraints
參數的一部分,並包含下列參數。- 所需 TimeNanos
- vsync 週期以下時間過後:
CLOCK_MONOTONIC
變更 (也就是說,vsync 週期在這段時間之前不得變更)。 當平台想要提前規劃刷新率變更,但佇列中已有要顯示的緩衝區時,這項功能就非常實用。平台會根據這些緩衝區設定這段時間,確保螢幕刷新率轉換過程盡可能順暢。 - seamlessRequired
- 如果為 true,則要求 vsync 期間變更必須無縫進行,且不會出現明顯的視覺瑕疵。當內容變更導致需要變更更新率時 (例如裝置處於閒置狀態且動畫開始播放),平台就會使用這個旗標。這樣一來,供應商就能在特定設定變更可能導致明顯視覺瑕疵時,禁止變更。如果無法順利變更設定,且
seamlessRequired
已設為true
,則實作應會傳回SEAMLESS_NOT_POSSIBLE
做為傳回碼,並在可順利變更相同設定時呼叫新的onSeamlessPossible
回呼。 實作成功後,系統會傳回
VsyncPeriodChangeTimeline
:告知平台預計何時 重新整理頻率newVsyncAppliedTimeNanos
參數必須設為CLOCK_MONOTONIC
中的時間,以便新顯示器在新的 vsync 期間開始重新整理。開發人員必須desiredTimeNanos
可讓平台預先規劃更新作業 速率切換功能,並立即開始使用應用程式,以體驗新的刷新率。這個 可讓你順利轉換重新整理頻率。有些實作項目需要先傳送重新整理影格,才能重新整理 還可以傳送費率針對這項要求,HAL 具有
refreshRequired
參數,表示需要重新整理影格refreshTimeNanos
表示用於重新整理影格的第一個 Vsync 這種磁碟區- onVsyncPeriodTimingChanged [回呼]
- HAL 可呼叫的新回呼,用於向平台指出時間軸的部分參數已變更,且平台需要調整時間軸。如果因 HAL 處理時間過長或刷新影格延遲,導致舊時間軸遺漏,則會呼叫這個回呼。
平台如何決定變更刷新率?
系統會在下列兩個系統服務中選取更新率:
- 多媒體廣告管理員
DisplayManager
會設定刷新率的高層級政策。這會設定預設的顯示設定,與 編輯器 HAL 設定此外,這個函數也會設定SurfaceFlinger
的值選擇為重新整理 頻率。- SurfaceFlinger
- 在相同設定中設置設定來決定重新整理頻率 群組設為預設設定,重新整理頻率 範圍。
顯示管理工具會按照下列步驟判斷政策:
- 透過查詢
SurfaceFlinger
中的有效設定,找出預設設定 ID - 透過疊代的方式限制最小值及最大值的範圍
系統條件
- 預設重新整理頻率設定:預設重新整理頻率值會在
R.integer.config_defaultRefreshRate
設定重疊圖層中設定。這個值可判斷動畫的標準裝置刷新率 和觸控互動 - 最高刷新率設定:最高重新整理頻率值
讀取自
Settings.System.PEAK_REFRESH_RATE
。這個值會在執行階段變更,以反映目前的裝置設定 (例如來自選單選項)。預設值會在R.integer.config_defaultPeakRefreshRate
設定疊加層中設定。 - 最小重新整理率設定:最小重新整理率值會從
Settings.System.MIN_REFRESH_RATE
讀取。這個值可在執行階段變更,以反映目前的裝置設定 (例如來自選單選項)。預設值為 0,因此沒有預設最小值。 - 應用程式要求 ModeId:應用程式可以設定
WindowManager.LayoutParams.preferredDisplayModeId
以反映螢幕應運作的偏好設定。在大多數情況下,DisplayManager
會依據情況設定預設設定 ID,並將最小和最大更新率設為與設定的更新率相符。 - 省電模式:刷新率僅限 60Hz 或
表示裝置處於低耗電模式時低,電池模式可透過
Settings.Global.LOW_POWER_MODE.
- 預設重新整理頻率設定:預設重新整理頻率值會在
DisplayManager
設定政策後,SurfaceFlinger
會根據有效圖層 (排入佇列的幀更新圖層) 設定更新率。如果圖層擁有者設定影格速率,SurfaceFlinger 會嘗試將更新速率設為該速率的倍數。舉例來說,假設兩個主動圖層的影格速率設為 24 和 60 SurfaceFlinger
會在 120Hz 可用的情況下選擇 120Hz如果 SurfaceFlinger 無法使用這類更新率,就會嘗試挑選最能降低影格速率誤差的更新率。詳情請參閱 developer.android.com 上的開發人員說明文件
SurfaceFlinger
會保留下列標記
控制刷新率的決定方式:
ro.surface_flinger.use_content_detection_for_refresh_rate:
如果已設定,系統會根據有效圖層決定更新率,即使未設定影格速率也一樣。SurfaceFlinger 會 如何找出圖層發布緩衝區的平均每秒影格數 請查看附加至緩衝區的呈現時間戳記ro.surface_flinger.set_touch_timer_ms
:如果 > 0,當使用者觸碰螢幕時,系統會使用預設的重新整理率,直到設定的逾時時間到期為止。這項經驗法則已準備好使用 動畫。ro.surface_flinger.set_idle_timer_ms
:如果 >刷新率下限 0 在指定逾時時間內沒有畫面更新時,就會使用這個值。ro.surface_flinger.set_display_power_timer_ms
:如果 > 0,系統會在開啟螢幕 (或退出 AOD) 時,使用預設的重新整理率,直到設定的逾時時間為止。
畫面更新率 API
影格速率 API 可讓應用程式向 Android 平台告知其預期的影格速率,並適用於指定 Android 11 為目標版本的應用程式。如要進一步瞭解影格速率 API,請參閱 developer.android.com 的開發人員說明文件。
開發人員選項
選單加入了新的開發人員選項,可切換重疊元素 顯示目前刷新率的螢幕新選項位於「設定」>「系統」>「開發人員選項」>「顯示更新率」。