SurfaceFlinger dan WindowManager

SurfaceFlinger menerima buffer, menyusun buffer, dan mengirim buffer ke tampilan. 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 {i>buffer<i} adalah melalui BufferQueue dan melalui 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 SurfaceControl, yang berisi metadata lapisan seperti frame tampilan. SurfaceFlinger membuat lapisan dan mengirimkannya ke WindowManager. Windows WindowManager lalu mengirimkan platform ke aplikasi, tetapi tetap mempertahankan SurfaceControl ke memanipulasi tampilan aplikasi di layar.

Android 10 menambahkan ASurfaceControl, yang merupakan cara lain bagi SurfaceFlinger untuk menerima buffering. ASurfaceControl menggabungkan platform dan SurfaceControl menjadi satu paket transaksi yang dikirim ke SurfaceFlinger. ASurfaceControl dikaitkan dengan lapisan, yang aplikasi memperbarui melalui ASurfaceTransactions. Aplikasi kemudian mendapatkan informasi tentang ASurfaceTransactions melalui callback yang meneruskan ASurfaceTransactionStats yang berisi informasi, seperti waktu kait, waktu memperoleh, dan seterusnya.

Tabel berikut ini berisi detail lebih lanjut tentang ASurfaceControl dan komponen yang terkait.

Komponen Deskripsi
{i>ASurfaceControl<i} Menggabungkan SurfaceControl dan memungkinkan aplikasi membuat SurfaceControls yang sesuai dengan lapisan di layar.

Dapat dibuat sebagai turunan dari ANativeWindow atau sebagai turunan dari ASurfaceControl lain.
{i>ASurfaceTransaction<i} Menggabungkan Transaksi agar klien dapat mengedit data deskriptif properti, seperti geometri, dan mengirimkan buffer yang diperbarui ke SurfaceFlinger.
{i>ASurfaceTransactionStats<i} 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 akan aktif untuk menerima buffer di antara refresh tampilan, yang dapat berbeda bergantung pada perangkat seluler. Hal ini meminimalkan penggunaan memori dan menghindari kerusakan yang terlihat pada yang dapat terjadi saat memperbarui tampilan di tengah-tengah pemuatan ulang.

Saat tampilan berada di antara refresh, tampilan 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 {i>buffer<i}. 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, dan komposit SurfaceFlinger lapisan berbeda. Kemudian, SurfaceFlinger meneruskan buffer output ke HWC.

WindowManager

WindowManager mengontrol objek window yang merupakan container untuk objek tampilan. Objek jendela selalu didukung oleh objek platform. 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 agar SurfaceFlinger dapat menggunakan data tersebut permukaan komposit pada layar.

Pra-rotasi

Banyak overlay perangkat keras yang tidak mendukung rotasi (dan meskipun mendukung rotasi, Anda memerlukan daya pemrosesan); solusinya adalah mengubah buffer sebelum mencapai SurfaceFlinger. Android mendukung petunjuk kueri (NATIVE_WINDOW_TRANSFORM_HINT) di ANativeWindow untuk merepresentasikan transformasi yang paling mungkin untuk diterapkan ke buffer dengan SurfaceFlinger. Driver GL dapat menggunakan petunjuk ini untuk melakukan pra-transformasi buffer sebelum mencapai SurfaceFlinger sehingga saat buffer tiba, buffer 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 menyimpan daya, lakukan pra-rotasi ini. Untuk mengetahui detailnya, lihat ANativeWindow dan antarmuka yang ditentukan dalam system/core/include/system/window.h.