Android 11 menambahkan dukungan untuk perangkat dengan beberapa kecepatan refresh. Ada tiga komponen utama untuk fitur ini:
- API HAL baru diperkenalkan di
android.hardware.graphics.composer@2.4
. - Kode platform untuk mengurai konfigurasi perangkat untuk kecepatan refresh yang berbeda dan mengatur kecepatan refresh yang diinginkan
- SDK dan NDK API baru untuk memungkinkan aplikasi menyetel frekuensi gambar yang diinginkan
Penerapan
Dukungan khusus untuk peralihan kecepatan refresh telah ditambahkan ke android.hardware.graphics.composer@2.4 HAL
. Kami sangat menyarankan menggunakan versi ini karena versi komposer HAL sebelumnya memiliki dukungan terbatas untuk peralihan kecepatan refresh.
Grup konfigurasi
Atribut baru CONFIG_GROUP
telah ditambahkan ke IComposerClient::Attribute
yang dapat ditanyakan menggunakan getDisplayAttribute_2_4
API. Atribut ini memungkinkan vendor untuk mengelompokkan konfigurasi tampilan. Konfigurasi dalam grup yang sama memungkinkan peralihan tanpa hambatan di antara mereka di sebagian besar kasus. Grup konfigurasi digunakan oleh platform untuk membedakan konfigurasi mana yang dapat dialihkan di antara mereka untuk mengubah kecepatan refresh dan bukan atribut lain untuk konfigurasi.
Pertimbangkan contoh berikut yang menunjukkan manfaat menggunakan grup konfigurasi dengan perangkat yang mendukung empat konfigurasi tampilan:
- 1080p@60Hz
- 1080p@90Hz
- 1080i@72Hz
- 1080i@48Hz
Meskipun perangkat mendukung kecepatan refresh 48Hz, 60Hz, 72Hz, dan 90Hz, layar beroperasi pada mode yang berbeda dan beralih dari 60Hz ke 72Hz mengubah konfigurasi tampilan dari 1080p ke 1080i, yang mungkin bukan perilaku yang diinginkan. Ini diselesaikan dengan menggunakan grup konfigurasi. Dengan mengelompokkan 60Hz dan 90Hz bersama-sama dalam satu grup konfigurasi dan 48Hz dan 72Hz dalam grup konfigurasi lainnya. Platform tahu bahwa itu dapat beralih antara 60Hz dan 90Hz dan antara 48Hz dan 72Hz tetapi tidak antara 60Hz dan 72Hz karena ini akan menghasilkan perubahan konfigurasi daripada hanya mengubah kecepatan refresh.
Pembaruan API Komposer
- getDisplayVsyncPeriod
- Untuk kontrol dan prediktabilitas yang lebih baik saat mengubah kecepatan refresh
getDisplayVsyncPeriod
telah ditambahkan.getDisplayVsyncPeriod
mengembalikan kecepatan refresh saat ini (dalam hal periode vsync) saat layar beroperasi. Ini sangat berguna saat transisi antara kecepatan refresh dan kecepatan refresh saat ini diperlukan oleh platform untuk memutuskan kapan memulai frame berikutnya. - setActiveConfigWithConstraints
- Metode
setActiveConfigWithConstraints
adalah ekstensi baru untuk metodesetActiveConfig
yang ada dan memberikan informasi lebih lanjut tentang perubahan konfigurasi. Batasan diberikan sebagai bagian dari parametervsyncPeriodChangeConstraints
dan berisi parameter berikut. - waktu yang diinginkanNanos
- Waktu dalam
CLOCK_MONOTONIC
setelah periode vsync dapat berubah (yaitu periode vsync tidak boleh berubah sebelum waktu ini). Ini berguna ketika platform ingin merencanakan ke depan untuk perubahan kecepatan refresh tetapi sudah memiliki beberapa buffer dalam antrian untuk disajikan. Platform menetapkan waktu ini sesuai untuk memperhitungkan buffer tersebut dan memastikan bahwa transisi kecepatan refresh akan semulus mungkin. - mulusDiperlukan
- Jika benar, mengharuskan perubahan periode vsync harus terjadi dengan mulus tanpa artefak visual yang terlihat. Bendera ini digunakan oleh platform saat perubahan kecepatan refresh diperlukan sebagai akibat dari perubahan konten (misalnya, perangkat dalam keadaan diam dan animasi dimulai). Ini memberi vendor kesempatan untuk tidak mengizinkan perubahan konfigurasi tertentu ketika mereka dapat menghasilkan artefak visual yang nyata. Jika konfigurasi tidak dapat diubah dengan mulus dan
seamlessRequired
disetel ketrue
, implementasi diharapkan mengembalikanSEAMLESS_NOT_POSSIBLE
sebagai kode pengembalian dan memanggil callbackonSeamlessPossible
yang baru ketika perubahan konfigurasi yang sama dapat dilakukan dengan mulus. Setelah berhasil, implementasi mengembalikan
VsyncPeriodChangeTimeline
yang memberi tahu platform kapan harus mengharapkan perubahan kecepatan refresh terjadi. parameternewVsyncAppliedTimeNanos
perlu disetel ke waktu diCLOCK_MONOTONIC
saat tampilan baru akan mulai disegarkan pada periode vsync baru. Ini, bersama dengandesiredTimeNanos
yang diinginkan memungkinkan platform untuk merencanakan terlebih dahulu sakelar kecepatan penyegaran dan mulai mencentang aplikasi untuk kecepatan penyegaran baru terlebih dahulu. Ini memungkinkan transisi kecepatan refresh yang mulus.Beberapa implementasi memerlukan bingkai penyegaran untuk dikirim sebelum kecepatan penyegaran dapat dikirim. Untuk itu, HAL memiliki parameter
refreshRequired
untuk menunjukkan bahwa bingkai penyegaran diperlukan danrefreshTimeNanos
untuk menunjukkan vsync pertama di mana bingkai penyegaran perlu dikirim setelahnya.- onVsyncPeriodTimingChanged [panggilan balik]
- Panggilan balik baru yang dapat dipanggil oleh HAL untuk menunjukkan ke platform bahwa beberapa parameter timeline berubah dan platform perlu menyesuaikan timeline-nya. Panggilan balik ini diharapkan akan dipanggil jika karena alasan tertentu garis waktu lama terlewatkan karena waktu pemrosesan yang lama pada HAL atau bingkai penyegaran yang terlambat.
Bagaimana platform memutuskan untuk mengubah kecepatan refresh?
Pemilihan kecepatan refresh terjadi di dua layanan sistem berikut:
- Manajer Tampilan
-
DisplayManager
menetapkan kebijakan tingkat tinggi seputar kecepatan refresh. Ini menetapkan konfigurasi tampilan default, yang sama dengan konfigurasi HAL komposer. Selain itu, 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.
Manajer Tampilan menjalankan langkah-langkah berikut untuk menentukan kebijakan:
- Menemukan ID konfigurasi default dengan menanyakan konfigurasi aktif dari
SurfaceFlinger
- Membatasi rentang nilai minimum dan maksimum dengan mengulangi kondisi sistem
- Pengaturan kecepatan refresh default : Nilai kecepatan refresh default diatur dalam overlay konfigurasi
R.integer.config_defaultRefreshRate
. Nilai ini digunakan untuk menentukan kecepatan refresh perangkat standar untuk animasi dan interaksi sentuh. - Pengaturan kecepatan refresh puncak: Nilai kecepatan refresh puncak dibaca dari
Settings.System.PEAK_REFRESH_RATE
. Nilai ini diubah dalam waktu proses untuk mencerminkan pengaturan perangkat saat ini (seperti dari opsi menu). Nilai default diatur dalam overlay konfigurasiR.integer.config_defaultPeakRefreshRate
. - Pengaturan kecepatan refresh minimum : Nilai kecepatan refresh minimum dibaca dari
Settings.System.MIN_REFRESH_RATE
. Nilai ini dapat diubah dalam waktu proses untuk mencerminkan pengaturan perangkat saat ini (seperti dari opsi menu). Nilai defaultnya adalah 0, jadi tidak ada minimum default. - ModeId yang diminta aplikasi : Aplikasi dapat mengatur
WindowManager.LayoutParams.preferredDisplayModeId
untuk mencerminkan konfigurasi pilihan yang harus dioperasikan oleh tampilan. Dalam sebagian besar kondisi,DisplayManager
menetapkan ID konfigurasi default yang sesuai dan menetapkan kecepatan refresh minimum dan maksimum agar sesuai dengan kecepatan refresh konfigurasi. - Penghemat Baterai : Kecepatan refresh dibatasi hingga 60Hz atau lebih rendah saat perangkat dalam mode daya rendah, yang ditunjukkan melalui
Settings.Global.LOW_POWER_MODE.
- Pengaturan kecepatan refresh default : Nilai kecepatan refresh default diatur dalam overlay konfigurasi
Setelah DisplayManager
menetapkan kebijakan, SurfaceFlinger
menetapkan kecepatan refresh berdasarkan lapisan aktif (lapisan yang mengantre pembaruan bingkai). Jika pemilik lapisan menyetel laju bingkai , SurfaceFlinger mencoba menyetel laju penyegaran ke sesuatu yang merupakan pengganda dari laju tersebut. Misalnya jika dua lapisan aktif mengatur kecepatan bingkai ke 24 dan 60 SurfaceFlinger akan memilih 120Hz jika tersedia. Jika kecepatan refresh tersebut tidak tersedia untuk SurfaceFlinger, itu akan mencoba untuk memilih kecepatan refresh yang memiliki kesalahan minimal untuk frame rate. Untuk informasi lebih lanjut, lihat dokumentasi pengembang di developer.android.com
SurfaceFlinger
mempertahankan flag berikut untuk mengontrol bagaimana kecepatan refresh ditentukan:
-
ro.surface_flinger.use_content_detection_for_refresh_rate:
Jika disetel, kecepatan refresh ditentukan berdasarkan lapisan aktif, bahkan jika kecepatan bingkai tidak disetel. SurfaceFlinger mempertahankan heuristik di mana ia menemukan fps rata-rata lapisan memposting buffer 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 untuk batas waktu yang dikonfigurasi. Heuristik ini dilakukan agar siap dengan kecepatan refresh default untuk animasi. -
ro.surface_flinger.set_idle_timer_ms
: jika > 0, kecepatan refresh min akan digunakan ketika tidak ada pembaruan layar untuk batas waktu yang dikonfigurasi. -
ro.surface_flinger.set_display_power_timer_ms
: jika > 0, kecepatan refresh default akan digunakan saat menghidupkan tampilan (atau saat keluar dari AOD) untuk batas waktu yang dikonfigurasi.
API Kecepatan Bingkai
API kecepatan bingkai memungkinkan aplikasi memberi tahu platform Android tentang kecepatan bingkai yang diinginkan dan tersedia di aplikasi yang menargetkan Android 11. Untuk mempelajari lebih lanjut tentang API kecepatan bingkai, lihat dokumentasi pengembang di developer.android.com .
Opsi pengembang
Opsi pengembang baru telah ditambahkan ke menu yang mengaktifkan overlay pada tampilan dengan kecepatan refresh saat ini. Opsi baru ada di bawah Pengaturan > Sistem > Opsi pengembang > Tampilkan kecepatan penyegaran.