Beberapa kecepatan refresh

Android 11 menambahkan dukungan untuk perangkat dengan beberapa kecepatan refresh. Ada tiga komponen utama dalam fitur ini:

  • API HAL baru diperkenalkan di android.hardware.graphics.composer@2.4.
  • Kode platform untuk mengurai konfigurasi perangkat bagi kecepatan refresh yang berbeda dan menetapkan kecepatan refresh yang diinginkan
  • SDK dan NDK API baru untuk memungkinkan aplikasi menetapkan 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 diubah antar-konfigurasi untuk mengalihkan kecepatan refresh, 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, 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 diatasi dengan menggunakan grup konfigurasi. Dengan mengelompokkan 60 Hz dan 90 Hz dalam satu grup konfigurasi dan 48 Hz dan 72 Hz dalam grup 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 untuk metode setActiveConfig yang ada dan memberikan informasi selengkapnya tentang perubahan konfigurasi. Batasan diberikan sebagai bagian dari parameter vsyncPeriodChangeConstraints dan berisi parameter berikut.
    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 perubahan kecepatan refresh, tetapi platform tersebut sudah memiliki beberapa buffer dalam antrean untuk ditampilkan. Platform menetapkan waktu ini dengan tepat untuk memperhitungkan buffering tersebut dan memastikan bahwa transisi kecepatan refresh akan selancar mungkin.
    seamlessRequired
    Jika benar, perubahan periode vsync 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 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 lancar dan seamlessRequired ditetapkan ke true, implementasi diharapkan menampilkan SEAMLESS_NOT_POSSIBLE sebagai kode return dan memanggil callback onSeamlessPossible 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. Parameter newVsyncAppliedTimeNanos harus ditetapkan ke waktu di CLOCK_MONOTONIC saat tampilan baru akan mulai dimuat ulang pada periode vsync baru. Hal ini, bersama dengan desiredTimeNanos, memungkinkan platform merencanakan tombol frekuensi refresh terlebih dahulu dan mulai mencentang aplikasi untuk frekuensi refresh 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 dan refreshTimeNanos 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 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 di sekitar kecepatan refresh. Tindakan ini menetapkan konfigurasi tampilan default, yang sama dengan konfigurasi HAL composer. Selain itu, metode ini menetapkan rentang nilai minimum dan maksimum untuk SurfaceFlinger yang 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 minimum/maksimum.

Display Manager akan 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 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 saat runtime untuk mencerminkan setelan perangkat saat ini (seperti dari opsi menu). Nilai default ditetapkan di overlay konfigurasi R.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, 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.

Setelah DisplayManager menetapkan kebijakan, SurfaceFlinger akan menetapkan kecepatan refresh berdasarkan lapisan aktif (lapisan yang mengantrekan pembaruan 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 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 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, kecepatan refresh default akan digunakan saat pengguna menyentuh layar selama waktu tunggu yang telah 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 pembaruan 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 diinginkan dan tersedia di aplikasi yang menargetkan Android 11. Untuk mempelajari API kecepatan frame lebih lanjut, lihat dokumentasi developer di developer.android.com.

Opsi developer

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