Android 11 menambahkan dukungan untuk perangkat dengan beberapa kecepatan refresh. Ada tiga komponen utama untuk fitur ini:
- HAL API baru 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
- SDK API dan NDK API baru untuk memungkinkan aplikasi menyetel kecepatan frame yang diinginkan
Implementasi
Dukungan khusus untuk peralihan kecepatan refresh telah ditambahkan ke
android.hardware.graphics.composer@2.4 HAL
.
Sebaiknya gunakan versi ini karena HAL composer
versi 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
perpindahan yang lancar di antara keduanya dalam sebagian besar kasus. Grup konfigurasi digunakan
oleh platform untuk membedakan konfigurasi
mana yang dapat dialihkan di antara
mengubah kecepatan refresh dan
bukan atribut lain untuk
konfigurasi.
Perhatikan contoh berikut yang menunjukkan manfaat menggunakan konfigurasi grup dengan perangkat yang mendukung empat konfigurasi tampilan:
- 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 diatasi dengan menggunakan grup konfigurasi. Dengan mengelompokkan 60 Hz dan 90 Hz menjadi satu konfigurasi dan 48Hz dan 72Hz di kelompok konfigurasi lain. Platform ini mengetahui bahwa platform dapat beralih antara 60 Hz dan 90 Hz serta antara 48 Hz dan 72 Hz, tetapi tidak antara 60 Hz dan 72 Hz karena hal ini akan menyebabkan perubahan konfigurasi, bukan hanya mengubah rasio 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 bertransisi antara kecepatan refresh dan kecepatan refresh saat ini diperlukan oleh platform untuk memutuskan kapan harus memulai frame berikutnya. - setActiveConfigWithConstraints
- Metode
setActiveConfigWithConstraints
adalah ekstensi baru ke metodesetActiveConfig
yang ada dan memberikan lebih banyak informasi tentang perubahan konfigurasi. Batasan diberikan sebagai bagian dari ParametervsyncPeriodChangeConstraints
dan berisi hal berikut parameter. - WaktuNanos yang diinginkan
- Waktu dalam
CLOCK_MONOTONIC
setelah periode vsync dapat berubah (yaitu periode vsync tidak boleh berubah sebelum waktu ini). Hal ini berguna saat platform ingin merencanakan kecepatan refresh ubah tetapi sudah ada beberapa {i>buffer<i} dalam antrian untuk ditampilkan. Platform mengatur waktu ini sesuai dengan perhitungan {i>buffer <i}tersebut dan pastikan bahwa transisi kecepatan refresh akan selancar mungkin. - seamlessRequired
- Jika benar, perubahan periode vsync harus terjadi dengan lancar
tanpa artefak visual yang terlihat. Penanda ini digunakan oleh
platform ketika sebuah
perubahan kecepatan refresh diperlukan sebagai akibat dari perubahan konten (misalnya,
perangkat tidak ada aktivitas dan animasi dimulai). Hal ini memberi vendor kesempatan untuk
tidak mengizinkan perubahan konfigurasi tertentu jika perubahan tersebut dapat menyebabkan artefak visual
yang terlihat. Jika konfigurasi tidak dapat diubah
dengan mulus dan
seamlessRequired
ditetapkan ketrue
, sehingga implementasinya diharapkan menampilkanSEAMLESS_NOT_POSSIBLE
sebagai kode pengembalian, dan panggil callbackonSeamlessPossible
baru jika konfigurasi yang sama perubahan dapat dilakukan dengan lancar. Setelah berhasil, implementasi akan mengembalikan
VsyncPeriodChangeTimeline
yang memberi tahu platform kapan akan perubahan kecepatan refresh.newVsyncAppliedTimeNanos
parameter harus disetel ke waktu diCLOCK_MONOTONIC
saat tampilan baru akan mulai dimuat ulang pada periode vsync yang baru. Hal ini, besertadesiredTimeNanos
memungkinkan platform merencanakan pembaruan terlebih dahulu mengubah kecepatan dan mulai menjalankan aplikasi untuk kecepatan refresh yang baru terlebih dahulu. Hal ini memungkinkan transisi kecepatan refresh yang lancar.Beberapa implementasi memerlukan frame refresh untuk dikirim 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 akan dipanggil jika karena alasan tertentu linimasa lama terlewat karena waktu pemrosesan yang lama di HAL atau pembaruan yang terlambat {i>frame<i}.
Bagaimana cara platform memutuskan untuk mengubah kecepatan refresh?
Pemilihan kecepatan refresh terjadi di dua layanan sistem berikut:
- {i>DisplayManager<i}
DisplayManager
menetapkan kebijakan tingkat tinggi di sekitar kecepatan refresh. Ini menetapkan konfigurasi tampilan default, yang sama dengan konfigurasi HAL komposer. Selain itu, metode ini menetapkan rentang nilai minimum dan maksimum untukSurfaceFlinger
yang akan dipilih sebagai kecepatan refresh.- SurfaceFlinger
- Menentukan kecepatan refresh dengan menetapkan konfigurasi yang berada dalam konfigurasi yang sama sebagai konfigurasi default dan dengan kecepatan refresh dalam rentang min/maks {i>range<i}.
Display Manager menjalankan langkah-langkah berikut untuk menentukan kebijakan:
- Menemukan ID konfigurasi default dengan mengkueri konfigurasi aktif dari
SurfaceFlinger
- Membatasi rentang nilai minimum dan maksimum dengan melakukan iterasi pada
kondisi sistem
- Setelan kecepatan refresh default: Nilai kecepatan refresh default
disetel di 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 dalam runtime untuk mencerminkan setelan perangkat saat ini (seperti dari opsi menu). Nilai default ditetapkan di overlay konfigurasiR.integer.config_defaultPeakRefreshRate
. - Setelan kecepatan refresh minimum: Nilai kecepatan refresh minimum
dibaca dari
Settings.System.MIN_REFRESH_RATE
. Nilai ini dapat diubah dalam runtime untuk mencerminkan setelan perangkat saat ini (seperti dari opsi menu). Nilai defaultnya adalah 0, sehingga tidak ada minimum default. - ModeId yang diminta aplikasi: Aplikasi dapat menetapkan
WindowManager.LayoutParams.preferredDisplayModeId
untuk mencerminkan konfigurasi pilihan yang harus digunakan tampilan. Dalam sebagian besar kondisi,DisplayManager
menetapkan ID konfigurasi default sebagaimana mestinya dan menetapkan kecepatan refresh minimum dan maksimum agar cocok dengan kecepatan 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
disetel di overlay konfigurasi
Setelah DisplayManager
menetapkan kebijakan,
SurfaceFlinger
menetapkan kecepatan refresh berdasarkan lapisan aktif (lapisan yang mengantrekan
update frame). Jika pemilik lapisan menetapkan frekuensi frame, SurfaceFlinger
akan mencoba menetapkan kecepatan refresh ke sesuatu yang merupakan pengganda kecepatan tersebut.
Misalnya, jika dua lapisan aktif menetapkan kecepatan frame ke 24 dan 60 SurfaceFlinger
akan memilih 120Hz jika tersedia. Jika kecepatan refresh tersebut tidak tersedia untuk
SurfaceFlinger, dia akan mencoba memilih
kecepatan refresh yang memiliki
error untuk kecepatan frame. Untuk informasi selengkapnya, lihat dokumentasi developer di developer.android.com
SurfaceFlinger
mempertahankan flag berikut untuk
mengontrol cara menentukan kecepatan refresh:
ro.surface_flinger.use_content_detection_for_refresh_rate:
Jika ditetapkan, kecepatan refresh ditentukan berdasarkan lapisan aktif, meskipun kecepatan frame tidak ditetapkan. SurfaceFlinger mempertahankan heuristik yang menemukan fps rata-rata yang diposting buffer lapisan dengan melihat stempel waktu presentasi yang dilampirkan ke buffer.ro.surface_flinger.set_touch_timer_ms
: jika > 0, frekuensi refresh default akan digunakan saat pengguna menyentuh layar untuk waktu tunggu yang dikonfigurasi. Heuristik ini dilakukan agar siap dengan kecepatan refresh {i>default<i} untuk animasi.ro.surface_flinger.set_idle_timer_ms
: jika > 0, kecepatan refresh minimum akan digunakan saat tidak ada pembaruan layar untuk waktu tunggu yang dikonfigurasi.ro.surface_flinger.set_display_power_timer_ms
: jika > 0, kecepatan refresh default akan digunakan saat menyalakan layar (atau saat dari AOD) untuk waktu tunggu yang telah dikonfigurasi.
Frame Rate API
API kecepatan frame memungkinkan aplikasi memberi tahu platform Android tentang tujuan kecepatan frame dan tersedia di aplikasi yang menargetkan Android 11. Untuk mempelajari lebih lanjut tentang API kecepatan frame, lihat dokumentasi developer di developer.android.com.
Opsi developer
Opsi developer baru telah ditambahkan ke menu yang mengaktifkan overlay layar dengan kecepatan refresh saat ini. Opsi baru ada di bagian Setelan > Sistem > Pengembang opsi > Tampilkan kecepatan refresh.