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.