Android 11 支援多種螢幕更新率的裝置。這項功能有三個主要元件:
android.hardware.graphics.composer@2.4
中導入了新的 HAL API。- 平台程式碼,用於剖析不同重新整理頻率的裝置設定,並設定所需的重新整理頻率
- 新的 SDK 和 NDK API,可讓應用程式設定所需的影格速率
實作
android.hardware.graphics.composer@2.4 HAL
新增了專屬的刷新率切換支援功能。強烈建議使用這個版本,因為舊版 Composer HAL 對於重新整理率切換的支援有限。
設定群組
IComposerClient::Attribute
新增了 CONFIG_GROUP
屬性,可使用 getDisplayAttribute_2_4
API 查詢。供應商可使用這項屬性將顯示器設定歸為一組。在同一個群組中設定,通常可讓您在這些設定之間順暢切換。平台會使用設定群組來區分可切換的設定,以便切換設定的更新率,而非其他屬性。
請參考下列範例,瞭解如何使用設定群組,為支援四種螢幕設定的裝置帶來好處:
- 1080p@60Hz
- 1080p@90Hz
- 1080i@72Hz
- 1080i@48Hz
雖然裝置支援 48 Hz、60 Hz、72 Hz 和 90 Hz 的螢幕刷新率,但螢幕運作模式不同,從 60 Hz 切換至 72 Hz 時,螢幕設定會從 1080p 變更為 1080i,這可能不是您想要的行為。使用配置群組即可解決這個問題。將 60Hz 和 90Hz 分在一個設定群組,48Hz 和 72Hz 分在另一個設定群組。平台知道可以在 60Hz 和 90Hz 之間,以及 48Hz 和 72Hz 之間切換,但無法在 60Hz 和 72Hz 之間切換,因為這會導致設定變更,而非單純變更刷新率。


Composer API 更新
- getDisplayVsyncPeriod
- 為了在變更重新整理頻率時提供更完善的控制和預測功能,已新增
getDisplayVsyncPeriod
。getDisplayVsyncPeriod
會傳回螢幕目前的刷新率 (以垂直同步週期表示)。在重新整理率之間轉換時,這項功能特別實用,平台需要目前的重新整理率,才能決定何時啟動下一個影格。 - setActiveConfigWithConstraints
setActiveConfigWithConstraints
方法是現有setActiveConfig
方法的新擴充功能,可提供更多有關設定變更的資訊。限制條件會以vsyncPeriodChangeConstraints
參數的形式提供,並包含下列參數。- desiredTimeNanos
CLOCK_MONOTONIC
中的時間,之後 vsync 週期可能會變更 (也就是說,vsync 週期不得在此時間之前變更)。當平台想提前規劃重新整理率變更,但佇列中已有要呈現的緩衝區時,這項功能就非常實用。平台會相應設定這個時間,以考量這些緩衝區,並盡可能確保更新率轉換過程順暢。- seamlessRequired
- 如果為 true,表示 VSync 週期變更必須順暢進行,不得出現明顯的視覺效果瑕疵。平台會在因內容變更而需要變更更新率時使用此旗標 (例如裝置處於閒置狀態,且動畫開始播放)。這樣一來,如果某些設定變更可能會導致明顯的視覺效果瑕疵,供應商就有機會不允許這些變更。如果無法順利變更設定,且
seamlessRequired
設為true
,實作項目應會傳回SEAMLESS_NOT_POSSIBLE
做為回傳代碼,並在順利完成相同設定變更時,呼叫新的onSeamlessPossible
回呼。 實作成功後,系統會傳回
VsyncPeriodChangeTimeline
,告知平台預期何時會發生更新率變更。newVsyncAppliedTimeNanos
參數必須設為CLOCK_MONOTONIC
中的時間,屆時新螢幕會以新的垂直同步週期開始重新整理。這項資訊和desiredTimeNanos
搭配使用,可讓平台預先規劃重新整理率切換作業,並預先開始為新重新整理率勾選應用程式。這樣就能流暢切換刷新率。部分實作方式需要先傳送重新整理影格,才能傳送重新整理率。為此,HAL 具有
refreshRequired
參數,可指出需要重新整理影格,而refreshTimeNanos
則可指出第一個垂直同步,之後需要傳送重新整理影格。- onVsyncPeriodTimingChanged [callback]
- HAL 可呼叫的新回呼,向平台指出時間軸的某些參數已變更,平台需要調整時間軸。如果因 HAL 處理時間過長或延遲重新整理影格,導致錯過舊時間軸,系統就會呼叫這個回呼。
平台如何決定變更螢幕更新率?
系統會在下列兩項系統服務中選取更新率:
- DisplayManager
DisplayManager
會設定重新整理率的高層級政策。這會設定預設顯示設定,與 Composer HAL 設定相同。此外,它還會設定最小值和最大值範圍,供SurfaceFlinger
選擇做為重新整理率。- SurfaceFlinger
- 設定與預設設定位於相同設定群組的設定,並將重新整理率設在最小值/最大值範圍內,即可決定重新整理率。
Display Manager 會執行下列步驟,判斷政策:
- 透過查詢
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 會選擇 120 Hz (如有)。如果 SurfaceFlinger 無法使用這類更新率,系統會嘗試選取影格率誤差最小的更新率。詳情請參閱 developer.android.com 的開發人員說明文件
SurfaceFlinger
會維護下列標記,以控管決定重新整理率的方式:
ro.surface_flinger.use_content_detection_for_refresh_rate:
如果未設定影格速率,系統會根據有效圖層決定重新整理率。SurfaceFlinger 會維護啟發式方法,透過查看附加至緩衝區的呈現時間戳記,找出圖層發布緩衝區的平均 FPS。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,則在開啟螢幕時 (或離開微光模式時),系統會使用預設更新率,直到設定的逾時時間到期為止。
Frame Rate API
影格速率 API 可讓應用程式將預期影格速率告知 Android 平台,適用於目標為 Android 11 的應用程式。如要進一步瞭解影格速率 API,請參閱 developer.android.com 的開發人員說明文件。
開發人員選項

選單中新增了開發人員選項,可切換顯示幕上的疊加層,顯示目前的刷新率。如要使用這項新選項,請依序前往「設定」 >「系統」 >「開發人員選項」 >「顯示更新率」。