Surface dan SurfaceHolder

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

Permukaan

Permukaan adalah antarmuka bagi produsen untuk bertukar buffer dengan konsumen.

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

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

Render 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 menggambar.
  • unlockCanvasAndPost() membuka kunci buffer dan mengirimkannya ke compositor.
  • lockHardwareCanvas() mengunci buffer untuk rendering pada GPU dan mengembalikan kanvas yang akan digunakan untuk menggambar.

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

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

SurfaceHolder

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.