Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.
Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

SurfaceFlinger dan WindowManager

SurfaceFlinger menerima buffer, menyusun buffer, dan mengirim buffer ke tampilan. WindowManager memberi SurfaceFlinger buffer dan metadata jendela, yang digunakan SurfaceFlinger untuk menggabungkan permukaan ke tampilan.

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 berada di latar depan, aplikasi meminta buffer dari WindowManager . WindowManager kemudian meminta lapisan dari SurfaceFlinger. Lapisan adalah kombinasi dari permukaan , yang berisi BufferQueue, danSurfaceControl , yang berisi metadata lapisan seperti bingkai tampilan. SurfaceFlinger membuat lapisan dan mengirimkannya ke WindowManager. WindowManager kemudian mengirimkan permukaan tersebut ke aplikasi, tetapi tetap mempertahankan SurfaceControl untuk memanipulasi tampilan aplikasi di layar.

Android 10 menambahkan ASurfaceControl, yang merupakan cara lain SurfaceFlinger dapat menerima buffer. ASurfaceControl menggabungkan permukaan dan SurfaceControl menjadi satu paket transaksi yang dikirim ke SurfaceFlinger. ASurfaceControl dikaitkan dengan lapisan, yang diupdate aplikasi melalui ASurfaceTransactions. Aplikasi kemudian mendapatkan informasi tentang ASurfaceTransactions melalui callback yang meneruskan ASurfaceTransactionStats yang berisi informasi, seperti waktu latch, waktu perolehan, dan sebagainya.

Tabel berikut menyertakan detail selengkapnya tentang ASurfaceControl dan komponen terkaitnya.

Komponen Deskripsi
ASurfaceControl Membungkus SurfaceControl dan memungkinkan aplikasi membuat SurfaceControls yang sesuai dengan lapisan di layar.

Dapat dibuat sebagai anak ANativeWindow atau sebagai anak dari ASurfaceControl lain.
ASurfaceTransaction Wraps Transaction untuk memungkinkan klien mengedit properti deskriptif lapisan, seperti geometri, dan mengirim buffer yang diperbarui ke SurfaceFlinger.
ASurfaceTransactionStats Mengirimkan informasi tentang transaksi yang telah disajikan, seperti waktu latch, waktu perolehan, dan pagar rilis sebelumnya, ke aplikasi melalui callback yang didaftarkan sebelumnya.

Meskipun aplikasi dapat mengirimkan buffer kapan saja, SurfaceFlinger hanya bangun untuk menerima buffer di antara penyegaran tampilan, yang dapat berbeda bergantung pada perangkatnya. Ini meminimalkan penggunaan memori dan menghindari robekan yang terlihat pada layar, yang dapat terjadi saat memperbarui tampilan di tengah penyegaran.

Saat layar berada di antara penyegaran, layar mengirimkan sinyal VSYNC ke SurfaceFlinger. Sinyal VSYNC menunjukkan bahwa tampilan dapat disegarkan tanpa robek. Saat SurfaceFlinger menerima sinyal VSYNC, SurfaceFlinger menelusuri daftar lapisannya untuk mencari buffer baru. Jika SurfaceFlinger menemukan buffer baru, SurfaceFlinger memperoleh buffer tersebut; jika tidak, SurfaceFlinger terus menggunakan buffer yang diperoleh sebelumnya. SurfaceFlinger harus selalu menampilkan sesuatu, jadi itu bergantung pada satu buffer. Jika tidak ada buffer yang pernah dikirimkan pada sebuah lapisan, lapisan tersebut diabaikan.

Setelah SurfaceFlinger mengumpulkan semua buffer untuk lapisan yang terlihat, ia menanyakan Hardware Composer (HWC) bagaimana komposisi harus dilakukan. Jika HWC menandai jenis komposisi lapisan sebagai komposisi klien, SurfaceFlinger akan menggabungkan lapisan tersebut. Kemudian, SurfaceFlinger meneruskan buffer keluaran ke HWC .

WindowManager

WindowManager mengontrol objek jendela , yang merupakan wadah untuk objek tampilan . Objek jendela selalu didukung oleh objek permukaan. WindowManager mengawasi siklus hidup, peristiwa input dan fokus, orientasi layar, transisi, animasi, posisi, transformasi, z-order, dan banyak aspek lain dari sebuah jendela. WindowManager mengirimkan semua metadata jendela ke SurfaceFlinger sehingga SurfaceFlinger dapat menggunakan data tersebut ke permukaan komposit pada tampilan.

Pra-rotasi

Banyak lapisan perangkat keras tidak mendukung perputaran (dan meskipun demikian, hal itu 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 ke buffer oleh SurfaceFlinger. Driver GL bisa menggunakan petunjuk ini untuk melakukan pra-transformasi buffer sebelum mencapai SurfaceFlinger sehingga saat buffer tiba, buffer tersebut diubah dengan benar.

Misalnya, saat menerima petunjuk untuk memutar 90 derajat, buat dan terapkan matriks ke buffer untuk mencegahnya berjalan di akhir halaman. Untuk menghemat daya, lakukan pra-rotasi ini. Untuk detailnya, lihat antarmuka ANativeWindow ditentukan di system/core/include/system/window.h .