Android 11 menambahkan dukungan untuk perangkat dengan beberapa kecepatan refresh. Ada tiga komponen utama untuk fitur ini:
- API HAL baru yang diperkenalkan di
android.hardware.graphics.composer@2.4
. - Kode platform untuk mengurai konfigurasi perangkat untuk kecepatan refresh yang berbeda dan menetapkan kecepatan refresh yang diinginkan
- API SDK dan NDK baru untuk memungkinkan aplikasi menyetel frekuensi gambar yang diinginkan
Implementasi
Dukungan khusus untuk peralihan rasio muat ulang telah ditambahkan ke
android.hardware.graphics.composer@2.4 HAL
.
Sebaiknya gunakan versi ini karena versi composer HAL sebelumnya memiliki dukungan terbatas untuk pengalihan kecepatan refresh.
Grup konfigurasi
Atribut baru CONFIG_GROUP
ditambahkan ke
IComposerClient::Attribute
yang dapat dikueri menggunakan
getDisplayAttribute_2_4
API. Atribut ini memungkinkan vendor mengelompokkan konfigurasi tampilan. Konfigurasi dalam grup yang sama memungkinkan peralihan yang lancar di antara konfigurasi tersebut dalam sebagian besar kasus. Grup konfigurasi digunakan oleh platform untuk membedakan konfigurasi mana yang dapat diubah di antara konfigurasi tersebut untuk mengubah kecepatan refresh dan bukan atribut lain untuk konfigurasi.
Pertimbangkan contoh berikut yang menunjukkan manfaat penggunaan grup konfigurasi dengan perangkat yang mendukung empat konfigurasi layar:
- 1080p@60Hz
- 1080p@90Hz
- 1080i@72Hz
- 1080i@48Hz
Meskipun perangkat mendukung kecepatan refresh 48 Hz, 60 Hz, 72 Hz, dan 90 Hz, layar beroperasi dalam mode yang berbeda dan beralih dari 60 Hz ke 72 Hz akan mengubah konfigurasi layar dari 1080p menjadi 1080i, yang mungkin bukan perilaku yang diinginkan. Hal ini dapat diselesaikan dengan menggunakan grup konfigurasi. Dengan mengelompokkan 60 Hz dan 90 Hz bersama-sama dalam satu grup konfigurasi dan 48 Hz dan 72 Hz dalam grup konfigurasi lainnya. Platform mengetahui bahwa platform dapat beralih antara 60 Hz dan 90 Hz serta antara 48 Hz dan 72 Hz, tetapi tidak dapat beralih antara 60 Hz dan 72 Hz karena hal ini akan menghasilkan perubahan konfigurasi, bukan hanya mengubah kecepatan refresh.


Update Composer API
- getDisplayVsyncPeriod
- Untuk kontrol dan prediktabilitas yang lebih baik saat mengubah kecepatan refresh,
getDisplayVsyncPeriod
telah ditambahkan.getDisplayVsyncPeriod
menampilkan kecepatan refresh saat ini (dalam hal periode vsync) yang digunakan tampilan. Hal ini sangat berguna saat melakukan transisi antara kecepatan refresh dan kecepatan refresh saat ini diperlukan oleh platform untuk memutuskan kapan harus memulai frame berikutnya. - setActiveConfigWithConstraints
- Metode
setActiveConfigWithConstraints
adalah ekstensi baru untuk metodesetActiveConfig
yang ada dan memberikan lebih banyak informasi tentang perubahan konfigurasi. Batasan diberikan sebagai bagian dari parametervsyncPeriodChangeConstraints
dan berisi parameter berikut. - desiredTimeNanos
- Waktu di
CLOCK_MONOTONIC
setelah periode sinkronisasi vertikal dapat berubah (yaitu, periode sinkronisasi vertikal tidak boleh berubah sebelum waktu ini). Hal ini berguna saat platform ingin merencanakan perubahan kecepatan refresh di masa mendatang, tetapi sudah memiliki beberapa buffer dalam antrean untuk ditampilkan. Platform menetapkan waktu ini sesuai dengan buffer tersebut dan memastikan bahwa transisi ke kecepatan refresh akan selancar mungkin. - seamlessRequired
- Jika benar, perubahan periode sinkronisasi vertikal harus terjadi dengan lancar
tanpa artefak visual yang terlihat. Flag ini digunakan oleh platform saat
perubahan kecepatan refresh diperlukan sebagai akibat dari perubahan konten (misalnya, perangkat tidak aktif dan animasi dimulai). Hal ini memberi vendor kesempatan untuk
tidak mengizinkan perubahan konfigurasi tertentu jika dapat menyebabkan artefak visual
yang terlihat jelas. Jika konfigurasi tidak dapat diubah dengan lancar dan
seamlessRequired
disetel ketrue
, implementasi diharapkan menampilkanSEAMLESS_NOT_POSSIBLE
sebagai kode yang ditampilkan dan memanggil callbackonSeamlessPossible
baru saat perubahan konfigurasi yang sama dapat dilakukan dengan lancar. Setelah berhasil, implementasi akan menampilkan
VsyncPeriodChangeTimeline
yang memberi tahu platform kapan perubahan kecepatan refresh akan terjadi.newVsyncAppliedTimeNanos
parameter harus disetel ke waktu diCLOCK_MONOTONIC
saat tampilan baru akan mulai di-refresh pada periode vsync baru. Bersama dengandesiredTimeNanos
, hal ini memungkinkan platform merencanakan peralihan kecepatan refresh sebelumnya dan mulai menandai aplikasi untuk kecepatan refresh baru sebelumnya. Hal ini memungkinkan transisi kecepatan refresh yang lancar.Beberapa penerapan memerlukan pengiriman frame refresh sebelum kecepatan refresh dapat dikirim. Untuk itu, HAL memiliki parameter
refreshRequired
untuk menunjukkan bahwa frame refresh diperlukan danrefreshTimeNanos
untuk menunjukkan vsync pertama tempat frame refresh perlu dikirim setelahnya.- onVsyncPeriodTimingChanged [callback]
- Callback baru yang dapat dipanggil oleh HAL untuk menunjukkan kepada platform bahwa beberapa parameter linimasa telah berubah dan platform perlu menyesuaikan linimasanya. Callback ini diharapkan dipanggil jika karena alasan tertentu, linimasa lama tidak terjadi karena waktu pemrosesan yang lama di HAL atau frame refresh yang terlambat.
Bagaimana platform memutuskan untuk mengubah kecepatan refresh?
Pemilihan kecepatan refresh terjadi di dua layanan sistem berikut:
- DisplayManager
DisplayManager
menetapkan kebijakan tingkat tinggi terkait kecepatan refresh. Fungsi ini menetapkan konfigurasi tampilan default, yang sama dengan konfigurasi HAL composer. Selain itu, metode ini menetapkan rentang nilai minimum dan maksimum untuk dipilihSurfaceFlinger
sebagai kecepatan refresh.- SurfaceFlinger
- Menentukan kecepatan refresh dengan menyetel konfigurasi yang berada dalam grup konfigurasi yang sama dengan konfigurasi default dan dengan kecepatan refresh dalam rentang min/maks.
Pengelola Iklan Display menjalankan langkah-langkah berikut untuk menentukan kebijakan:
- Menemukan ID konfigurasi default dengan membuat kueri konfigurasi aktif dari
SurfaceFlinger
- Membatasi rentang nilai minimum dan maksimum dengan melakukan iterasi pada
kondisi sistem
- Setelan kecepatan refresh default: Nilai kecepatan refresh default
ditetapkan dalam overlay konfigurasi
R.integer.config_defaultRefreshRate
. Nilai ini digunakan untuk menentukan kecepatan refresh perangkat standar untuk animasi dan interaksi sentuh. - Setelan kecepatan refresh puncak: Nilai kecepatan refresh puncak
dibaca dari
Settings.System.PEAK_REFRESH_RATE
. Nilai ini diubah saat runtime untuk mencerminkan setelan perangkat saat ini (seperti dari opsi menu). Nilai default ditetapkan dalam overlay konfigurasiR.integer.config_defaultPeakRefreshRate
. - Setelan kecepatan refresh minimum: Nilai kecepatan refresh minimum
dibaca dari
Settings.System.MIN_REFRESH_RATE
. Nilai ini dapat diubah saat runtime untuk mencerminkan setelan perangkat saat ini (seperti dari opsi menu). Nilai defaultnya adalah 0, jadi tidak ada minimum default. - ModeId yang diminta aplikasi: Aplikasi dapat menyetel
WindowManager.LayoutParams.preferredDisplayModeId
untuk mencerminkan konfigurasi pilihan yang harus digunakan layar. Dalam sebagian besar kondisi,DisplayManager
menetapkan ID konfigurasi default dengan tepat dan menetapkan frekuensi refresh minimum dan maksimum agar sesuai dengan frekuensi refresh konfigurasi. - Penghemat Baterai: Kecepatan refresh dibatasi hingga 60 Hz atau
lebih rendah saat perangkat dalam mode daya rendah, yang ditunjukkan melalui
Settings.Global.LOW_POWER_MODE.
- Setelan kecepatan refresh default: Nilai kecepatan refresh default
ditetapkan dalam overlay konfigurasi
Setelah DisplayManager
menetapkan kebijakan,
SurfaceFlinger
menetapkan kecepatan refresh berdasarkan lapisan aktif (lapisan yang mengantrekan
update frame). Jika pemilik lapisan menetapkan kecepatan frame, SurfaceFlinger akan mencoba menetapkan kecepatan refresh ke sesuatu yang merupakan kelipatan kecepatan tersebut.
Misalnya, jika dua lapisan aktif menetapkan kecepatan frame-nya ke 24 dan 60, SurfaceFlinger akan memilih 120 Hz jika tersedia. Jika kecepatan refresh tersebut tidak tersedia untuk
SurfaceFlinger, SurfaceFlinger akan mencoba memilih kecepatan refresh yang memiliki
error minimal untuk kecepatan frame. Untuk mengetahui informasi selengkapnya, lihat dokumentasi developer di developer.android.com
SurfaceFlinger
mempertahankan tanda berikut untuk mengontrol cara penentuan kecepatan refresh:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Jika disetel, kecepatan refresh diputuskan berdasarkan lapisan aktif, meskipun kecepatan frame tidak disetel. SurfaceFlinger mempertahankan heuristik tempat ia menemukan fps rata-rata yang diposting buffer oleh lapisan dengan melihat stempel waktu presentasi yang dilampirkan ke buffer.ro.surface_flinger.set_touch_timer_ms
: jika > 0, kecepatan refresh default akan digunakan saat pengguna menyentuh layar selama waktu tunggu yang dikonfigurasi. Heuristik ini dilakukan agar siap dengan kecepatan refresh default untuk animasi.ro.surface_flinger.set_idle_timer_ms
: jika > 0, kecepatan refresh minimum akan digunakan saat tidak ada update layar untuk waktu tunggu yang dikonfigurasi.ro.surface_flinger.set_display_power_timer_ms
: jika > 0, kecepatan refresh default akan digunakan saat mengaktifkan layar (atau saat keluar dari AOD) untuk waktu tunggu yang dikonfigurasi.
Frame Rate API
API kecepatan frame memungkinkan aplikasi memberi tahu platform Android tentang kecepatan frame yang diinginkannya dan tersedia di aplikasi yang menargetkan Android 11. Untuk mempelajari lebih lanjut API kecepatan frame, lihat dokumentasi developer di developer.android.com.
Opsi developer

Opsi developer baru telah ditambahkan ke menu yang mengalihkan overlay pada tampilan dengan kecepatan refresh saat ini. Opsi baru ini ada di bagian Setelan > Sistem > Opsi developer > Tampilkan kecepatan refresh.