Lapisan dan tampilan

Lapisan dan tampilan adalah dua primitif yang mewakili karya komposisi dan interaksi dengan perangkat keras tampilan tertentu.

Lapisan

Lapisan adalah unit komposisi yang paling penting. Lapisan adalah kombinasi permukaan dan instance SurfaceControl Setiap lapisan memiliki kumpulan properti yang menentukan cara berinteraksi dengan lapisan lain. Properti lapisan dijelaskan dalam tabel di bawah.

Properti Deskripsi
Posisional Menentukan tempat lapisan muncul di layarnya. Mencakup informasi seperti posisi tepi lapisan dan urutan Z relatif terhadap lapisan lain (apakah itu harus di depan atau di belakang lapisan lainnya).
Konten Menentukan bagaimana konten ditampilkan pada lapisan harus disajikan dalam batas yang ditentukan oleh properti posisi. Termasuk informasi seperti sebagai pangkas (untuk memperluas sebagian konten guna mengisi batas lapisan) dan transformasi (untuk menampilkan konten yang diputar atau dibalik).
Komposisi Mendefinisikan bagaimana lapisan harus disusun dengan lapisan lain. Menyertakan informasi seperti mode penggabungan dan nilai alfa seluruh lapisan untuk komposisi alfa.
Pengoptimalan Memberikan informasi yang tidak terlalu diperlukan untuk menggabungkan lapisan dengan benar, tetapi dapat digunakan oleh perangkat Hardware Composer (HWC) untuk mengoptimalkan cara perangkat tersebut melakukan komposisi. Menyertakan informasi seperti wilayah lapisan yang terlihat dan bagian lapisan mana yang telah diperbarui sejak frame sebelumnya.

Layar

Tampilan adalah unit komposisi penting lainnya. Suatu sistem dapat memiliki beberapa layar dan dapat ditambahkan atau dilepas selama operasi sistem normal. Layar adalah ditambahkan/dihapus atas permintaan HWC atau atas permintaan framework. Perangkat HWC meminta layar ditambahkan atau dihapus saat layar eksternal terhubung atau terputus dari perangkat, yang disebut hotplugging. Klien meminta tampilan virtual, yang isinya dirender ke buffer luar-layar, bukan ke tampilan fisik.

Layar virtual

SurfaceFlinger mendukung layar internal (terintegrasi dalam ponsel atau tablet), layar eksternal (seperti televisi yang terhubung melalui HDMI), dan satu atau beberapa layar virtual yang menyediakan output gabungan dalam sistem. Layar virtual dapat digunakan untuk merekam layar atau mengirim layar melalui jaringan. Frame dibuat untuk tampilan virtual ditulis ke BufferQueue.

Layar virtual dapat memiliki kumpulan lapisan yang sama dengan layar utama (stack lapisan) atau memiliki kumpulannya sendiri. Tidak ada VSYNC untuk tampilan virtual, sehingga VSYNC untuk tampilan internal memicu komposisi untuk semua tampilan.

Dalam implementasi HWC yang mendukungnya, layar dapat digabungkan dengan OpenGL ES (GLES), HWC, atau GLES dan HWC. Pada implementasi yang tidak mendukung, layar virtual selalu digabungkan menggunakan GLES.

Studi kasus: screenrecord

Perintah screenrecord memungkinkan pengguna merekam semua yang muncul di layar sebagai file .mp4 di disk. Untuk mengimplementasikannya, sistem menerima {i>frame<i} yang digabungkan dari SurfaceFlinger, menulisnya ke encoder video, lalu menulis kode data video ke file. Codec video dikelola oleh proses terpisah (mediaserver), sehingga buffer grafis yang besar harus berpindah di sekitar sistem file. Untuk membuatnya lebih menantang, tujuannya adalah untuk merekam video 60 fps pada resolusi penuh. Kunci untuk membuat pekerjaan ini efisien adalah BufferQueue.

Class MediaCodec memungkinkan aplikasi menyediakan data sebagai byte mentah dalam buffer, atau melalui permukaan. Saat screenrecord meminta akses ke video encoder, proses mediaserver membuat BufferQueue, menghubungkan ke sisi konsumen, lalu meneruskan sisi produser kembali ke screenrecord sebagai platform.

Utilitas screenrecord kemudian meminta SurfaceFlinger untuk membuat layar virtual yang mencerminkan layar utama (yaitu, memiliki semua lapisan yang sama), dan mengarahkannya untuk mengirim output ke platform yang berasal dari proses mediaserver. Dalam hal ini, SurfaceFlinger adalah produsen buffer, bukan konsumen.

Setelah konfigurasi selesai, screenrecord akan terpicu saat data yang dienkode akan muncul. Saat aplikasi menggambar, buffer-nya akan ditransfer ke SurfaceFlinger, yang menggabungkannya menjadi satu buffer yang dikirim langsung ke encoder video dalam proses mediaserver. {i>Frame<i} penuh tidak pernah dilihat oleh proses screenrecord. Secara internal, proses mediaserver memiliki cara tersendiri untuk memindahkan buffering yang juga meneruskan data melalui handle, sehingga meminimalkan overhead.

Studi kasus: menyimulasikan tampilan sekunder

WindowManager dapat meminta SurfaceFlinger untuk membuat lapisan yang terlihat yang SurfaceFlinger bertindak sebagai konsumen BufferQueue. Dimungkinkan juga untuk mengajukan SurfaceFlinger untuk membuat tampilan virtual, di mana SurfaceFlinger bertindak sebagai produser BufferQueue.

Jika Anda menghubungkan tampilan virtual ke lapisan yang terlihat, loop tertutup akan dibuat tempat layar gabungan muncul di jendela. Jendela tersebut kini menjadi bagian dari output gabungan, sehingga pada pembaruan berikutnya, gambar gabungan di dalam jendela juga akan menampilkan konten jendela. Untuk melihat cara kerjanya, aktifkan Opsi developer di Setelan, pilih Simulasi layar sekunder, lalu aktifkan jendela. Untuk melihat cara kerja tampilan sekunder, gunakan screenrecord untuk merekam tindakan mengaktifkan layar, lalu memutarnya kembali per frame.