Lapisan dan tampilan

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

Lapisan

Lapisan adalah unit komposisi yang paling penting. Lapisan adalah kombinasi permukaan dan turunan SurfaceControl . Setiap lapisan memiliki sekumpulan properti yang menentukan bagaimana lapisan tersebut berinteraksi dengan lapisan lainnya. Properti lapisan dijelaskan pada tabel di bawah ini.

Properti Keterangan
posisional Menentukan di mana lapisan muncul pada tampilannya. Mencakup informasi seperti posisi tepi suatu lapisan dan urutan Z -nya relatif terhadap lapisan lain (apakah harus berada di depan atau di belakang lapisan lain).
Isi Mendefinisikan bagaimana konten yang ditampilkan pada lapisan harus disajikan dalam batas yang ditentukan oleh properti posisi. Menyertakan informasi seperti memotong (untuk memperluas sebagian konten untuk memenuhi batas lapisan) dan mengubah (untuk menampilkan konten yang diputar atau dibalik).
Komposisi Mendefinisikan bagaimana lapisan harus digabungkan dengan lapisan lainnya. Menyertakan informasi seperti mode campuran dan nilai alfa seluruh lapisan untuk pengomposisian alfa .
Optimasi Memberikan informasi yang tidak sepenuhnya diperlukan untuk menyusun lapisan dengan benar, namun dapat digunakan oleh perangkat Hardware Composer (HWC) untuk mengoptimalkan cara kinerja komposisi. Berisi informasi seperti wilayah lapisan yang terlihat dan bagian mana dari lapisan yang telah diperbarui sejak frame sebelumnya.

Menampilkan

Tampilan adalah unit komposisi penting lainnya. Suatu sistem dapat memiliki beberapa tampilan dan tampilan dapat ditambahkan atau dihapus selama pengoperasian sistem normal. Tampilan ditambahkan/dihapus atas permintaan HWC atau atas permintaan kerangka kerja. Perangkat HWC meminta tampilan ditambahkan atau dihapus ketika layar eksternal dihubungkan atau diputuskan dari perangkat, yang disebut hotplugging . Klien meminta tampilan virtual , yang isinya dirender ke buffer di luar layar, bukan ke tampilan fisik.

Tampilan virtual

SurfaceFlinger mendukung tampilan internal (yang terpasang pada ponsel atau tablet), tampilan eksternal (seperti televisi yang terhubung melalui HDMI), dan satu atau lebih tampilan virtual yang membuat keluaran gabungan tersedia dalam sistem. Tampilan virtual dapat digunakan untuk merekam layar atau mengirim layar melalui jaringan. Bingkai yang dihasilkan untuk tampilan virtual ditulis ke BufferQueue.

Tampilan virtual mungkin berbagi kumpulan lapisan yang sama dengan tampilan utama (tumpukan lapisan) atau memiliki kumpulannya sendiri. Tidak ada VSYNC untuk tampilan virtual, jadi VSYNC untuk tampilan internal memicu komposisi untuk semua tampilan.

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

Studi kasus: rekaman layar

Perintah screenrecord memungkinkan pengguna untuk merekam segala sesuatu yang muncul di layar sebagai file .mp4 pada disk. Untuk mengimplementasikan hal ini, sistem menerima frame gabungan dari SurfaceFlinger, menulisnya ke encoder video, dan kemudian menulis data video yang dikodekan ke file. Codec video dikelola oleh proses terpisah ( mediaserver ), sehingga buffer grafis yang besar harus dipindahkan ke seluruh sistem. Agar lebih menantang, tujuannya adalah merekam video 60 fps dengan resolusi penuh. Kunci untuk membuat ini bekerja secara efisien adalah BufferQueue.

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

Utilitas screenrecord kemudian meminta SurfaceFlinger untuk membuat tampilan virtual yang mencerminkan tampilan utama (yaitu, ia memiliki semua lapisan yang sama), dan mengarahkannya untuk mengirimkan keluaran ke permukaan yang berasal dari proses mediaserver . Dalam hal ini, SurfaceFlinger adalah produsen buffer, bukan konsumen.

Setelah konfigurasi selesai, screenrecord terpicu ketika data yang dikodekan muncul. Saat aplikasi menggambar, buffernya berpindah ke SurfaceFlinger, yang menggabungkannya menjadi buffer tunggal yang dikirim langsung ke encoder video dalam proses mediaserver . Bingkai penuh tidak pernah terlihat dalam proses screenrecord . Secara internal, proses mediaserver memiliki caranya sendiri untuk memindahkan buffer yang juga meneruskan data dengan pegangan, sehingga meminimalkan overhead.

Studi kasus: simulasikan tampilan sekunder

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

Jika Anda menyambungkan tampilan virtual ke lapisan terlihat, loop tertutup dibuat di mana layar gabungan muncul di jendela. Jendela itu sekarang menjadi bagian dari keluaran gabungan, jadi pada penyegaran berikutnya, gambar gabungan di dalam jendela juga menampilkan isi jendela. Untuk melihat cara kerjanya, aktifkan opsi Pengembang di Pengaturan , pilih Simulasikan tampilan sekunder , dan aktifkan jendela. Untuk melihat tampilan sekunder beraksi, gunakan screenrecord untuk menangkap tindakan mengaktifkan tampilan, lalu memutarnya bingkai demi bingkai.