Lapisan dan layar adalah dua primitif yang mewakili pekerjaan komposisi dan interaksi dengan hardware layar.
Lapisan
Lapisan adalah unit komposisi yang paling penting. Lapisan adalah
kombinasi platform dan instance
SurfaceControl
. Setiap lapisan memiliki kumpulan properti yang
menentukan cara berinteraksi dengan lapisan lain. Properti lapisan dijelaskan dalam tabel di bawah.
Properti | Deskripsi |
---|---|
Posisi | Menentukan tempat lapisan muncul di layarnya. Menyertakan informasi seperti posisi tepi lapisan dan urutan Z relatif terhadap lapisan lain (baik di depan maupun di belakang lapisan lain). |
Konten | Menentukan cara konten yang ditampilkan di lapisan harus ditampilkan dalam batas yang ditentukan oleh properti posisi. Menyertakan informasi seperti pemangkasan (untuk memperluas sebagian konten guna mengisi batas lapisan) dan transformasi (untuk menampilkan konten yang diputar atau dibalik). |
Komposisi | Menentukan cara lapisan 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
Layar adalah satuan komposisi penting lainnya. Sistem dapat memiliki beberapa layar dan layar dapat ditambahkan atau dihapus selama operasi sistem normal. Layar ditambahkan/dihapus atas permintaan HWC atau atas permintaan framework. Tampilan permintaan perangkat HWC ditambahkan atau dihapus saat layar eksternal terhubung atau terputus dari perangkat, yang disebut hotplugging. Klien meminta layar virtual, yang kontennya dirender ke buffering di luar layar, bukan ke layar 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 yang dihasilkan 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.
Pada implementasi HWC yang mendukungnya, layar virtual 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 menerapkannya, sistem menerima frame gabungan dari
SurfaceFlinger, menulisnya ke encoder video, lalu menulis data
video yang dienkode ke file. Codec video dikelola oleh proses terpisah
(mediaserver
), sehingga buffer grafis besar harus berpindah di sekitar
sistem. Untuk membuatnya lebih menantang, targetnya adalah merekam video 60 fps dengan
resolusi penuh. Kunci untuk membuat hal ini berfungsi secara efisien adalah BufferQueue.
Class MediaCodec
memungkinkan aplikasi menyediakan data sebagai byte mentah dalam buffering,
atau melalui platform. Saat screenrecord
meminta akses ke encoder
video, proses mediaserver
akan membuat BufferQueue, menghubungkan
dirinya ke sisi konsumen, lalu meneruskan sisi produsen 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 muncul. Saat menggambar aplikasi, buffer-nya bergerak ke SurfaceFlinger,
yang menggabungkannya menjadi satu buffer yang dikirim langsung ke encoder
video dalam proses mediaserver
. Frame lengkap 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. Anda juga dapat meminta SurfaceFlinger untuk membuat layar virtual, yang berfungsi 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
tampilan sekunder yang sedang beroperasi, gunakan screenrecord
untuk merekam tindakan
mengaktifkan tampilan, lalu putar ulang frame demi frame.