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.