Android 11 menambahkan dukungan untuk perangkat dengan beberapa kecepatan refresh. Fitur ini memiliki tiga komponen utama:
- 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 menetapkan kecepatan frame yang diinginkan
Penerapan
Dukungan khusus untuk pengalihan kecepatan refresh telah ditambahkan ke …Sebaiknya gunakan versi ini karena versi HAL composer 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 pengalihan yang lancar di antara keduanya dalam sebagian besar kasus. Platform menggunakan grup konfigurasi untuk membedakan konfigurasi mana yang dapat dialihkan untuk mengalihkan kecepatan refresh dan bukan atribut lain untuk konfigurasi.
Pertimbangkan contoh berikut yang menunjukkan manfaat penggunaan grup konfigurasi 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, tampilan beroperasi dalam mode yang berbeda, dan pengalihan dari 60 Hz ke 72 Hz mengubah konfigurasi tampilan dari 1080p menjadi 1080i, yang mungkin bukan perilaku yang diinginkan. Grup konfigurasi mengatasi masalah ini. Dengan mengelompokkan 60 Hz dan 90 Hz dalam satu grup konfigurasi dan 48 Hz dan 72 Hz dalam grup konfigurasi lain, platform 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 menghasilkan perubahan konfigurasi, bukan hanya mengubah kecepatan refresh.
Update Composer API
- getDisplayVsyncPeriod
- Untuk kontrol dan prediktabilitas yang lebih baik saat mengubah kecepatan refresh,
getDisplayVsyncPeriodtelah ditambahkan.getDisplayVsyncPeriodmenampilkan kecepatan refresh saat ini (dalam hal periode vsync) yang digunakan tampilan. Hal ini sangat berguna saat melakukan transisi antara kecepatan refresh, dan platform memerlukan kecepatan refresh saat ini untuk memutuskan kapan harus memulai frame berikutnya. - setActiveConfigWithConstraints
- Metode
setActiveConfigWithConstraintsadalah ekstensi baru untuk metodesetActiveConfigyang ada dan memberikan informasi selengkapnya tentang perubahan konfigurasi. Batasan diberikan sebagai bagian darivsyncPeriodChangeConstraintsparameter dan berisi parameter berikut parameter. - desiredTimeNanos
- Waktu dalam
CLOCK_MONOTONICsetelah periode vsync dapat berubah (yaitu, periode vsync tidak boleh berubah sebelum waktu ini). Hal ini berguna saat platform ingin merencanakan perubahan kecepatan refresh tetapi sudah memiliki beberapa buffer dalam antrean untuk ditampilkan. Platform menetapkan waktu ini sesuai dengan buffer tersebut dan memastikan bahwa transisi kecepatan refresh akan semulus mungkin. - seamlessRequired
- Jika benar (true), perubahan periode vsync harus terjadi dengan lancar
tanpa artefak visual yang terlihat. Platform menggunakan flag ini saat a
perubahan kecepatan refresh diperlukan sebagai hasil dari perubahan konten (misalnya, perangkat
tidak ada aktivitas dan animasi dimulai). Hal ini memberi vendor kesempatan untuk
tidak mengizinkan perubahan konfigurasi tertentu jika dapat menghasilkan artefak visual yang terlihat. Jika konfigurasi tidak dapat diubah dengan lancar dan
seamlessRequiredditetapkan ketrue, penerapan diharapkan menampilkanSEAMLESS_NOT_POSSIBLEsebagai kode hasil dan memanggil callbackonSeamlessPossiblebaru saat perubahan konfigurasi yang sama dapat dilakukan dengan lancar. Setelah berhasil, penerapan akan menampilkan
VsyncPeriodChangeTimelineyang memberi tahu platform kapan perubahan kecepatan refresh akan terjadi. ParameternewVsyncAppliedTimeNanosharus ditetapkan ke waktu dalamCLOCK_MONOTONICsaat tampilan baru akan mulai di-refresh pada periode vsync baru. Hal ini, bersama dengandesiredTimeNanos, memungkinkan platform merencanakan pengalihan kecepatan refresh terlebih dahulu dan memulai aplikasi yang berdetak untuk kecepatan refresh baru terlebih dahulu. Hal ini memungkinkan transisi kecepatan refresh yang lancar.Beberapa penerapan memerlukan frame refresh untuk dikirim sebelum kecepatan refresh dapat dikirim. Untuk itu, HAL memiliki
refreshRequiredparameter untuk menunjukkan bahwa frame refresh diperlukan danrefreshTimeNanosuntuk menunjukkan vsync pertama tempat frame refresh perlu dikirim setelahnya.- onVsyncPeriodTimingChanged [callback]
- Callback baru yang dapat dipanggil 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 terlewat karena waktu pemrosesan yang lama di HAL atau frame refresh yang terlambat.
Bagaimana platform memutuskan untuk mengubah kecepatan refresh?
Pemilihan kecepatan refresh terjadi dalam dua layanan sistem berikut:
- DisplayManager
- The
DisplayManagermenetapkan kebijakan tingkat tinggi terkait kecepatan refresh. Metode ini menetapkan konfigurasi tampilan default, yang sama dengan konfigurasi HAL composer. Selain itu, metode ini menetapkan rentang nilai minimum dan maksimum untukSurfaceFlingeryang akan dipilih sebagai kecepatan refresh. - SurfaceFlinger
- Menentukan kecepatan refresh dengan menetapkan konfigurasi yang berada dalam grup konfigurasi yang sama dengan konfigurasi default dan dengan kecepatan refresh dalam rentang min/maks.
Pengelola Tampilan 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
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 di ubah saat runtime untuk mencerminkan setelan perangkat saat ini (seperti dari opsi menu option). Nilai default ditetapkan dalamR.integer.config_defaultPeakRefreshRateoverlay konfigurasi. - 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 opsi). Nilai defaultnya adalah 0, sehingga tidak ada nilai minimum default. - ModeId yang diminta Aplikasi: Aplikasi dapat menetapkan
WindowManager.LayoutParams.preferredDisplayModeIduntuk mencerminkan konfigurasi pilihan yang harus digunakan tampilan. Dalam sebagian besar kondisi,DisplayManagermenetapkan ID konfigurasi default yang sesuai dan menetapkan kecepatan refresh minimum dan maksimum agar sesuai dengan kecepatan refresh konfigurasi. - Penghemat Baterai: Kecepatan refresh dibatasi hingga 60 Hz atau
lebih rendah saat perangkat dalam mode hemat daya, 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 akan 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 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 flag berikut untuk mengontrol cara kecepatan refresh ditentukan:
ro.surface_flinger.use_content_detection_for_refresh_rate:Jika ditetapkan, kecepatan refresh akan ditentukan berdasarkan lapisan aktif, meskipun kecepatan frame tidak ditetapkan. SurfaceFlinger maintains a heuristic where it finds the average fps the layer is posting buffers by looking at the presentation timestamp attached to the buffer.ro.surface_flinger.set_touch_timer_ms: jika > 0, kecepatan refresh default akan digunakan saat pengguna menyentuh layar untuk 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 jika 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 tampilan (atau saat keluar dari AOD) untuk waktu tunggu yang dikonfigurasi.
Frame Rate API
Frame rate API memungkinkan aplikasi memberi tahu platform Android tentang kecepatan frame yang diinginkan dan tersedia di aplikasi yang menargetkan Android 11. Untuk mempelajari frame rate API lebih lanjut, 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 berada di bagian Setelan > Sistem > Opsi developer > Tampilkan kecepatan refresh.