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

Surface dan SurfaceHolder

Objek permukaan memungkinkan aplikasi merender gambar untuk disajikan 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 tiga kali. 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 antrean. Mengalokasikan buffer sesuai permintaan membantu meminimalkan konsumsi memori. Anda dapat melihat ringkasan buffer yang terkait dengan setiap lapisan dalam keluaran dumpsys SurfaceFlinger .

Sebagian besar 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, Anda memanggil Canvas API, yang menyetel byte dalam buffer dengan tepat. Untuk memastikan bahwa buffer tidak diperbarui oleh dua klien sekaligus, atau ditulis ke 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 yang akan digunakan untuk 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 berbagi 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 unlockCanvasAndPost() antara bingkai yang dirender sebelumnya.

Kode kunci / buka kunci permukaan menyimpan referensi ke buffer yang dirender sebelumnya. Jika Anda menentukan wilayah kotor saat mengunci permukaan, itu menyalin nondirty piksel 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 menyetel 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.