Lapisan dan tampilan

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.