Surface dan SurfaceHolder

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

Platform

Platform adalah antarmuka bagi produsen untuk bertukar buffering dengan konsumen.

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

Sebagian besar klien merender ke platform menggunakan OpenGL ES atau Vulkan. Namun, beberapa klien merender ke platform menggunakan kanvas.

Rendering kanvas

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

  • lockCanvas() mengunci buffering untuk rendering di CPU dan menampilkan Kanvas yang akan digunakan untuk menggambar.
  • unlockCanvasAndPost() membuka kunci buffering dan mengirimkannya ke kompositor.
  • lockHardwareCanvas() mengunci buffer untuk rendering di GPU dan menampilkan kanvas yang akan digunakan untuk menggambar.

Saat pertama kali produsen meminta buffer dari BufferQueue, buffer akan dialokasikan dan diinisialisasi menjadi nol. Inisialisasi diperlukan untuk menghindari berbagi data secara tidak sengaja antar-proses. Namun, jika Anda menggunakan kembali buffering, konten sebelumnya masih ada. Jika Anda berulang kali memanggil lockCanvas() dan unlockCanvasAndPost() tanpa menggambar apa pun, produsen akan beralih di antara frame yang dirender sebelumnya.

Kode kunci/buka kunci platform menyimpan referensi ke buffering yang dirender sebelumnya. Jika Anda menentukan area kotor saat mengunci platform, area tersebut akan menyalin piksel nonkotor dari buffering sebelumnya. SurfaceFlinger atau HWC biasanya menangani buffering; tetapi karena kita hanya perlu membaca dari buffer, tidak perlu menunggu akses eksklusif.

SurfaceHolder

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

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