Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

BufferQueue dan Gralloc

Kelas BufferQueue menghubungkan komponen yang menghasilkan buffer data grafis ( produsen ) ke komponen yang menerima data untuk ditampilkan atau diproses lebih lanjut ( konsumen ). Hampir semua yang memindahkan buffer data grafis melalui sistem bergantung pada BufferQueue.

Pengalokasi memori Gralloc melakukan alokasi buffer dan diimplementasikan melalui dua antarmuka HIDL khusus vendor (lihat hardware/interfaces/graphics/allocator/ dan hardware/interfaces/graphics/mapper/ ). Fungsi allocate() mengambil argumen yang diharapkan (lebar, tinggi, format piksel) serta satu set tanda penggunaan.

BufferQueue produsen dan konsumen

Konsumen membuat dan memiliki struktur data BufferQueue dan dapat berada dalam proses yang berbeda dari produsennya. Saat produsen membutuhkan buffer, ia meminta buffer gratis dari BufferQueue dengan memanggil dequeueBuffer() , yang menentukan lebar buffer, tinggi, format piksel, dan tanda penggunaan. Produser kemudian mengisi buffer dan mengembalikan buffer ke antrian dengan memanggil queueBuffer() . Selanjutnya, konsumen memperoleh buffer dengan acquireBuffer() dan memanfaatkan konten buffer. Ketika konsumen selesai, ia mengembalikan buffer ke antrian dengan memanggil releaseBuffer() . Kerangka kerja sinkronisasi mengontrol bagaimana buffer bergerak melalui pipeline grafis Android.

Beberapa karakteristik BufferQueue, seperti jumlah buffer maksimum yang dapat ditampungnya, ditentukan bersama oleh produsen dan konsumen. Namun, BufferQueue mengalokasikan buffer sesuai kebutuhannya. Buffer dipertahankan kecuali jika karakteristik berubah; misalnya, jika produsen meminta buffer dengan ukuran berbeda, buffer lama dibebaskan dan buffer baru dialokasikan sesuai permintaan.

Isi buffer tidak pernah disalin oleh BufferQueue, karena memindahkan banyak data itu tidak efisien. Sebaliknya, buffer selalu diteruskan oleh sebuah pegangan.

Melacak BufferQueue dengan Systrace

Untuk memahami bagaimana buffer grafis bergerak, gunakan Systrace , alat yang merekam aktivitas perangkat dalam waktu singkat. Kode grafik tingkat sistem diinstrumentasi dengan baik, seperti halnya banyak kode kerangka aplikasi yang relevan.

Untuk menggunakan Systrace, aktifkan tag gfx , view , dan sched . Objek BufferQueue ditampilkan di jejak. Sebagai contoh, jika Anda mengambil jejak saat video Putar Grafika (SurfaceView) sedang berjalan, baris berlabel SurfaceView memberi tahu Anda berapa banyak buffer yang diantrekan pada waktu tertentu.

Nilai bertambah saat aplikasi aktif, yang memicu rendering bingkai oleh dekoder MediaCodec. Nilai menurun saat SurfaceFlinger bekerja dan menggunakan buffer. Saat menampilkan video pada 30 fps, nilai antrian bervariasi dari 0 hingga 1 karena tampilan ~ 60 fps dapat mengikuti sumbernya. SurfaceFlinger hanya aktif saat ada pekerjaan yang harus diselesaikan, bukan 60 kali per detik. Sistem mencoba menghindari pekerjaan dan menonaktifkan VSYNC jika tidak ada yang memperbarui layar.

Jika Anda beralih ke video Putar Grafika (TextureView) dan mengambil jejak baru, Anda akan melihat baris berlabel com.android.grafika / com.android.grafika.PlayMovieActivity . Ini adalah lapisan UI utama, yang merupakan BufferQueue lainnya. Karena TextureView merender ke dalam lapisan UI, bukan lapisan terpisah, semua pembaruan yang didorong video ditampilkan di sini.

Gralloc

Pengalokasi Gralloc HAL hardware/libhardware/include/hardware/gralloc.h melakukan alokasi buffer melalui tanda penggunaan. Tanda penggunaan mencakup atribut seperti:

  • Seberapa sering memori akan diakses dari perangkat lunak (CPU)
  • Seberapa sering memori akan diakses dari perangkat keras (GPU)
  • Apakah memori akan digunakan sebagai tekstur OpenGL ES (GLES)
  • Apakah memori akan digunakan oleh pembuat enkode video

Misalnya, jika format buffer produsen menentukan RGBA_8888 piksel, dan produsen menunjukkan bahwa buffer akan diakses dari perangkat lunak (artinya aplikasi akan menyentuh piksel pada CPU), Gralloc membuat buffer dengan 4 byte per piksel dalam urutan RGBA. Jika sebaliknya, produsen menetapkan buffernya hanya akan diakses dari perangkat keras dan sebagai tekstur GLES, Gralloc dapat melakukan apa pun yang diinginkan driver GLES, seperti pemesanan BGRA, tata letak swizzled nonlinear, dan format warna alternatif. Mengizinkan perangkat keras menggunakan format pilihannya dapat meningkatkan kinerja.

Beberapa nilai tidak dapat digabungkan pada platform tertentu. Misalnya, tanda pembuat enkode video mungkin memerlukan piksel YUV, jadi penambahan akses perangkat lunak dan menentukan RGBA_8888 gagal.

Pegangan yang dikembalikan oleh Gralloc dapat diteruskan antar proses melalui Binder.

Buffer terlindungi

Bendera penggunaan GRALLOC_USAGE_PROTECTED memungkinkan buffer grafis ditampilkan hanya melalui jalur yang dilindungi perangkat keras. Bidang overlay ini adalah satu-satunya cara untuk menampilkan konten DRM (buffer yang dilindungi DRM tidak dapat diakses oleh SurfaceFlinger atau driver OpenGL ES).

Video yang dilindungi DRM hanya dapat disajikan di bidang hamparan. Pemutar video yang mendukung konten yang dilindungi harus diimplementasikan dengan SurfaceView. Perangkat lunak yang berjalan pada perangkat keras yang tidak dilindungi tidak dapat membaca atau menulis buffer; jalur yang dilindungi perangkat keras harus muncul di hamparan Komposer Perangkat Keras (yaitu, video yang dilindungi menghilang dari tampilan jika Komposer Perangkat Keras beralih ke komposisi OpenGL ES).

Untuk detail tentang konten yang dilindungi, lihat DRM .