SurfaceFlinger menerima buffer, menyusun buffer, dan mengirim buffer ke
layar. WindowManager
menyediakan buffer dan metadata
jendela untuk SurfaceFlinger, yang digunakan SurfaceFlinger untuk menggabungkan platform ke layar.
SurfaceFlinger
SurfaceFlinger dapat menerima buffering dengan dua cara: melalui BufferQueue dan
SurfaceControl
, atau melalui ASurfaceControl
.
Salah satu cara SurfaceFlinger menerima buffering adalah melalui BufferQueue dan
SurfaceControl
. Saat muncul di latar depan, aplikasi akan meminta buffering dari
WindowManager
. WindowManager
kemudian meminta lapisan dari
SurfaceFlinger. Lapisan adalah kombinasi dari platform, yang berisi BufferQueue, dan
instance SurfaceControl
,
yang berisi metadata lapisan seperti frame tampilan.
SurfaceFlinger membuat lapisan dan mengirimkannya ke WindowManager
. WindowManager
kemudian mengirim platform ke aplikasi, tetapi mempertahankan instance SurfaceControl
untuk
memanipulasi tampilan aplikasi di layar.
Android 10 menambahkan ASurfaceControl
, yang merupakan cara
lain bagi SurfaceFlinger untuk menerima buffering. ASurfaceControl
menggabungkan platform
dan instance SurfaceControl
menjadi satu paket transaksi yang dikirim ke
SurfaceFlinger. ASurfaceControl
dikaitkan dengan lapisan, yang diperbarui oleh aplikasi
melalui instance ASurfaceTransaction
. Aplikasi kemudian mendapatkan informasi tentang
instance ASurfaceTransaction
melalui callback yang meneruskan ASurfaceTransactionStats
yang berisi informasi, seperti waktu latch, waktu akuisisi, dan sebagainya.
Tabel berikut berisi detail selengkapnya tentang ASurfaceControl
dan
komponen terkaitnya:
Komponen | Deskripsi |
---|---|
ASurfaceControl |
Menggabungkan SurfaceControl dan memungkinkan aplikasi membuat instance SurfaceControl yang
sesuai dengan lapisan di layar.Dapat dibuat sebagai turunan ANativeWindow atau sebagai turunan dari instance ASurfaceControl lain. |
ASurfaceTransaction |
Menggabungkan Transaction untuk memungkinkan klien mengedit properti deskriptif
lapisan, seperti geometri, dan mengirim buffer yang diperbarui ke
SurfaceFlinger. |
ASurfaceTransactionStats
| Mengirim informasi tentang transaksi yang telah ditampilkan, seperti waktu latch, waktu akuisisi, dan pagar rilis sebelumnya, ke aplikasi melalui callback yang terdaftar sebelumnya. |
Meskipun aplikasi dapat mengirimkan buffer kapan saja, SurfaceFlinger hanya aktif untuk menerima buffer di antara refresh 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 layar berada di antara refresh, layar akan mengirimkan sinyal VSync ke SurfaceFlinger. Sinyal VSync menunjukkan bahwa tampilan dapat dimuat ulang tanpa tearing. Saat SurfaceFlinger menerima sinyal VSync, SurfaceFlinger akan menelusuri daftar lapisannya untuk mencari buffer baru. Jika SurfaceFlinger menemukan buffer baru, SurfaceFlinger akan memperoleh buffer; jika tidak, SurfaceFlinger akan terus menggunakan buffer yang diperoleh sebelumnya. SurfaceFlinger harus selalu menampilkan sesuatu, sehingga bergantung pada satu buffering. Jika tidak ada buffering yang pernah dikirim di lapisan, lapisan akan diabaikan.
Setelah mengumpulkan semua buffering untuk lapisan yang terlihat, SurfaceFlinger akan menanyakan cara komposisi harus dilakukan kepada Hardware Composer (HWC). Jika HWC menandai jenis 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
antarmuka komposit di layar.
Pra-rotasi
Banyak overlay hardware yang tidak mendukung rotasi (dan meskipun mendukung, akan memerlukan
kekuatan pemrosesan); solusinya adalah mengubah buffer sebelum mencapai
SurfaceFlinger. Android mendukung petunjuk kueri
(NATIVE_WINDOW_TRANSFORM_HINT
) di ANativeWindow
untuk
mewakili transformasi yang paling mungkin diterapkan ke buffering oleh
SurfaceFlinger. Driver GL dapat menggunakan petunjuk ini untuk melakukan pra-transformasi buffering
sebelum mencapai SurfaceFlinger sehingga saat buffering tiba, buffering tersebut
akan ditransformasikan dengan benar.
Misalnya, saat menerima petunjuk untuk memutar 90 derajat, buat dan terapkan
matriks ke buffer untuk mencegahnya berjalan di luar akhir halaman. Untuk menghemat
daya, lakukan pra-rotasi ini. Untuk mengetahui detailnya, lihat antarmuka ANativeWindow
yang ditentukan di system/core/include/system/window.h
.