SurfaceFlinger menerima buffer, menyusun buffer, dan mengirim buffer ke
layar. WindowManager
menyediakan buffer dan metadata jendela ke SurfaceFlinger, yang digunakan SurfaceFlinger untuk menggabungkan platform ke layar.
SurfaceFlinger
SurfaceFlinger dapat menerima buffer dengan dua cara: melalui BufferQueue dan
SurfaceControl
, atau melalui ASurfaceControl
.
Salah satu cara SurfaceFlinger menerima buffer adalah melalui BufferQueue dan
SurfaceControl
. Saat muncul di latar depan, aplikasi akan meminta buffer dari
WindowManager
. WindowManager
kemudian meminta lapisan dari
SurfaceFlinger. Lapisan adalah kombinasi dari surface, yang berisi BufferQueue, dan
instance SurfaceControl
,
yang berisi metadata lapisan seperti frame tampilan.
SurfaceFlinger membuat lapisan dan mengirimkannya ke WindowManager
. WindowManager
lalu mengirimkan platform ke aplikasi, tetapi mempertahankan instance SurfaceControl
untuk
memanipulasi tampilan aplikasi di layar.
Android 10 menambahkan ASurfaceControl
, yang merupakan
cara lain agar SurfaceFlinger dapat menerima buffer. ASurfaceControl
menggabungkan instance SurfaceControl
dan platform menjadi satu paket transaksi yang dikirim ke SurfaceFlinger. ASurfaceControl
dikaitkan dengan lapisan, yang diperbarui aplikasi melalui instance ASurfaceTransaction
. Aplikasi kemudian mendapatkan informasi tentang instance
ASurfaceTransaction
melalui callback yang meneruskan ASurfaceTransactionStats
yang berisi informasi, seperti waktu pelepasan, waktu perolehan, dan sebagainya.
Tabel berikut berisi detail selengkapnya tentang ASurfaceControl
dan komponen terkaitnya:
Komponen | Deskripsi |
---|---|
ASurfaceControl |
Membungkus SurfaceControl dan memungkinkan aplikasi membuat instance SurfaceControl yang
sesuai dengan lapisan pada layar.Dapat dibuat sebagai turunan dari ANativeWindow atau sebagai turunan dari instance ASurfaceControl lainnya. |
ASurfaceTransaction |
Membungkus Transaction untuk memungkinkan klien mengedit properti deskriptif
lapisan, seperti geometri, dan mengirim buffer yang diperbarui ke
SurfaceFlinger. |
ASurfaceTransactionStats
| Mengirimkan informasi tentang transaksi yang telah ditampilkan, seperti waktu pelepasan, waktu perolehan, dan batas rilis sebelumnya, ke aplikasi melalui callback yang telah didaftarkan sebelumnya. |
Meskipun aplikasi dapat mengirimkan buffer kapan saja, SurfaceFlinger hanya aktif untuk menerima buffer di antara pemuatan ulang layar, yang dapat berbeda-beda bergantung pada perangkat. Hal ini meminimalkan penggunaan memori dan menghindari tearing yang terlihat di layar, yang dapat terjadi saat memperbarui tampilan di tengah refresh.
Saat tampilan berada di antara refresh, tampilan akan mengirimkan sinyal VSync ke SurfaceFlinger. Sinyal VSync menunjukkan bahwa tampilan dapat diperbarui tanpa masalah tearing. Saat menerima sinyal VSync, SurfaceFlinger menelusuri daftar layernya untuk mencari buffer baru. Jika SurfaceFlinger menemukan buffer baru, SurfaceFlinger akan mengambil buffer tersebut; jika tidak, SurfaceFlinger akan terus menggunakan buffer yang sebelumnya diambil. SurfaceFlinger harus selalu menampilkan sesuatu, jadi SurfaceFlinger akan tetap menggunakan satu buffer. Jika tidak ada buffer yang pernah dikirimkan di lapisan, lapisan akan diabaikan.
Setelah mengumpulkan semua buffer untuk lapisan yang terlihat, SurfaceFlinger akan bertanya kepada Hardware Composer (HWC) tentang cara komposisi harus dilakukan. Jika jenis komposisi lapisan HWC menandai komposisi lapisan sebagai komposisi klien, SurfaceFlinger akan menggabungkan lapisan tersebut. Kemudian, SurfaceFlinger meneruskan buffer output ke HWC.
WindowManager
WindowManager
mengontrol objek Window
,
yang merupakan penampung untuk objek View
. Objek Window
selalu didukung oleh objek
Surface
.
WindowManager
mengawasi siklus proses, peristiwa input dan fokus, orientasi layar, transisi, animasi, posisi, transformasi, urutan z, dan banyak aspek jendela lainnya. WindowManager
mengirimkan semua metadata jendela ke SurfaceFlinger sehingga SurfaceFlinger dapat menggunakan data tersebut untuk menggabungkan tampilan di layar.
Pra-rotasi
Banyak overlay hardware tidak mendukung rotasi (dan meskipun mendukung, hal ini memerlukan daya pemrosesan); solusinya adalah mengubah buffer sebelum mencapai SurfaceFlinger. Android mendukung petunjuk kueri
(NATIVE_WINDOW_TRANSFORM_HINT
) di ANativeWindow
untuk
mewakili kemungkinan transformasi yang akan diterapkan ke buffer oleh
SurfaceFlinger. Driver GL dapat menggunakan petunjuk ini untuk melakukan pra-transformasi buffer
sebelum mencapai SurfaceFlinger sehingga saat buffer tiba, buffer tersebut ditransformasikan dengan benar.
Misalnya, saat menerima petunjuk untuk memutar 90 derajat, buat dan terapkan matriks ke buffer untuk mencegahnya keluar dari akhir halaman. Untuk menghemat
daya, lakukan ini sebelum rotasi. Untuk mengetahui detailnya, lihat antarmuka ANativeWindow
yang ditentukan dalam system/core/include/system/window.h
.