SurfaceFlinger dan WindowManager

SurfaceFlinger menerima, menggabungkan, dan mengirim buffer ke layar. WindowManager menyediakan buffer dan metadata jendela ke SurfaceFlinger, yang kemudian 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 aplikasi muncul di latar depan, aplikasi akan meminta buffer dari WindowManager. WindowManager kemudian meminta layer dari SurfaceFlinger. Layer adalah kombinasi dari platform, yang berisi BufferQueue, dan instance SurfaceControl, yang berisi metadata layer seperti frame tampilan. SurfaceFlinger membuat layer dan mengirimkannya ke WindowManager. WindowManager kemudian mengirim platform ke aplikasi, tetapi menyimpan instance SurfaceControl untuk memanipulasi tampilan aplikasi di layar.

Mulai Android 10, ASurfaceControl menyediakan cara lain bagi SurfaceFlinger untuk menerima buffer. ASurfaceControl menggabungkan platform dan instance SurfaceControl ke dalam satu paket transaksi yang diterima SurfaceFlinger. ASurfaceControl dikaitkan dengan layer, yang diperbarui aplikasi melalui instance ASurfaceTransaction. Aplikasi kemudian mendapatkan informasi tentang ASurfaceTransaction instance melalui callback yang meneruskan ASurfaceTransactionStats yang berisi informasi, seperti waktu pengaitan dan waktu perolehan.

Tabel berikut menjelaskan ASurfaceControl dan komponen terkaitnya:

Komponen Deskripsi
ASurfaceControl Menggabungkan SurfaceControl dan memungkinkan aplikasi membuat instance SurfaceControl yang sesuai dengan layer di layar.
Dapat dibuat sebagai turunan ANativeWindow atau sebagai turunan instance ASurfaceControl lainnya.
ASurfaceTransaction Menggabungkan Transaction untuk memungkinkan klien mengedit properti deskriptif layer, seperti geometri, dan mengirim buffer yang diperbarui ke SurfaceFlinger.
ASurfaceTransactionStats Mengirim informasi tentang transaksi yang telah ditampilkan, seperti waktu pengaitan, waktu perolehan, dan pagar rilis sebelumnya, ke aplikasi melalui callback yang telah terdaftar.

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 layar di tengah refresh.

Saat layar berada di antara refresh, layar akan mengirim sinyal VSync ke SurfaceFlinger. Sinyal VSync menunjukkan bahwa layar dapat di-refresh tanpa tearing. Saat menerima sinyal VSync, SurfaceFlinger akan menelusuri daftar layernya untuk mencari buffer baru. Jika menemukan buffer baru, SurfaceFlinger akan memperoleh buffer tersebut. Jika tidak, SurfaceFlinger akan terus menggunakan buffer yang diperoleh sebelumnya. SurfaceFlinger harus selalu menampilkan sesuatu, sehingga SurfaceFlinger akan mempertahankan satu buffer. Jika tidak ada buffer yang pernah dikirimkan di layer, SurfaceFlinger akan mengabaikan layer tersebut.

Setelah SurfaceFlinger mengumpulkan semua buffer untuk layer yang terlihat, SurfaceFlinger akan meminta Hardware Composer (HWC) untuk mengetahui cara melakukan komposisi. Jika HWC menandai jenis komposisi layer sebagai komposisi klien, SurfaceFlinger akan menggabungkan layer tersebut. Kemudian, SurfaceFlinger akan meneruskan buffer output ke HWC.

WindowManager

WindowManager mengontrol objek Window, yang merupakan penampung untuk objek View. Objek Window selalu didukung oleh Surface objek. WindowManager mengawasi siklus proses, peristiwa input dan fokus, orientasi layar, transisi, animasi, posisi, transformasi, z-order, dan banyak aspek jendela lainnya. WindowManager mengirim semua metadata jendela ke SurfaceFlinger sehingga SurfaceFlinger dapat menggunakan data tersebut untuk menggabungkan platform di layar.

Pra-rotasi

Banyak overlay hardware yang tidak mendukung rotasi (dan meskipun mendukung, hal ini akan menghabiskan daya 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 SurfaceFlinger ke buffer. Driver GL dapat menggunakan petunjuk ini untuk melakukan pra-transformasi buffer sebelum mencapai SurfaceFlinger sehingga saat buffer tiba, buffer akan ditransformasi 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 pra-rotasi ini. Untuk mengetahui detailnya, lihat antarmuka ANativeWindow yang ditentukan di system/core/include/system/window.h.