Permukaan dan SurfaceHolder

Objek permukaan memungkinkan aplikasi merender gambar untuk ditampilkan di layar. Antarmuka SurfaceHolder memungkinkan aplikasi mengedit dan mengontrol permukaan.

Permukaan

Permukaan adalah antarmuka bagi produsen untuk bertukar buffer dengan konsumen.

BufferQueue untuk permukaan tampilan biasanya dikonfigurasi untuk buffering tiga kali lipat. Buffer dialokasikan berdasarkan permintaan, jadi jika produsen menghasilkan buffer dengan cukup lambat, misalnya pada 30 fps pada tampilan 60 fps, mungkin hanya ada dua buffer yang dialokasikan dalam antrean. Mengalokasikan buffer sesuai permintaan membantu meminimalkan konsumsi memori. Anda dapat melihat ringkasan buffer yang terkait dengan setiap lapisan di output dumpsys SurfaceFlinger .

Kebanyakan klien merender ke permukaan menggunakan OpenGL ES atau Vulkan . Namun, beberapa klien merender ke permukaan menggunakan kanvas.

Rendering kanvas

Implementasi kanvas disediakan oleh Skia Graphics Library . Jika Anda ingin menggambar persegi panjang, panggil Canvas API, yang menyetel byte dalam buffer dengan tepat. Untuk memastikan bahwa buffer tidak diperbarui oleh dua klien sekaligus, atau ditulis saat sedang ditampilkan, kunci buffer untuk mengaksesnya. Gunakan perintah berikut untuk bekerja dengan kunci kanvas:

  • lockCanvas() mengunci buffer untuk rendering pada CPU dan mengembalikan Canvas untuk digunakan dalam menggambar.
  • unlockCanvasAndPost() membuka kunci buffer dan mengirimkannya ke kompositor.
  • lockHardwareCanvas() mengunci buffer untuk rendering pada GPU dan mengembalikan kanvas yang akan digunakan untuk menggambar.

Pertama kali produsen meminta buffer dari BufferQueue, buffer dialokasikan dan diinisialisasi ke nol. Inisialisasi diperlukan untuk menghindari pembagian data antar proses secara tidak sengaja. Namun, jika Anda menggunakan kembali buffer, konten sebelumnya masih ada. Jika Anda berulang kali memanggil lockCanvas() dan unlockCanvasAndPost() tanpa menggambar apa pun, produser akan melakukan siklus di antara frame yang dirender sebelumnya.

Kode kunci/buka kunci permukaan menyimpan referensi ke buffer yang dirender sebelumnya. Jika Anda menentukan wilayah kotor saat mengunci permukaan, ini akan menyalin piksel tidak kotor dari buffer sebelumnya. SurfaceFlinger atau HWC biasanya menangani buffer; tapi karena kita hanya perlu membaca dari buffer, tidak perlu menunggu akses eksklusif.

Pemegang Permukaan

SurfaceHolder adalah antarmuka yang digunakan sistem untuk berbagi kepemilikan permukaan dengan aplikasi. Beberapa klien yang bekerja dengan permukaan menginginkan SurfaceHolder, karena API untuk mendapatkan dan mengatur parameter permukaan diimplementasikan melalui SurfaceHolder. SurfaceView berisi SurfaceHolder.

Sebagian besar komponen yang berinteraksi dengan tampilan melibatkan SurfaceHolder. Beberapa API lain, seperti MediaCodec, beroperasi di permukaan itu sendiri.