Objek platform memungkinkan aplikasi merender gambar untuk ditampilkan di layar. Antarmuka SurfaceHolder memungkinkan aplikasi mengedit dan mengontrol permukaan.
Platform
Surface adalah antarmuka bagi produsen untuk bertukar buffer dengan konsumen.
Permukaan tampilan biasanya menggunakan BufferQueue yang dikonfigurasi untuk
triple-buffering. Buffer dialokasikan sesuai permintaan, jadi jika produsen
membuat buffer cukup lambat, seperti pada 30 fps di layar 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 output dumpsys SurfaceFlinger
.
Sebagian besar klien merender ke platform menggunakan OpenGL ES atau Vulkan. Namun, beberapa klien merender ke permukaan menggunakan kanvas.
Rendering kanvas
Skia Graphics Library menyediakan implementasi kanvas. Jika Anda ingin menggambar persegi panjang, Anda memanggil Canvas API, yang menetapkan byte dalam buffer dengan tepat. Untuk memastikan buffer tidak diupdate oleh dua klien sekaligus, atau ditulis saat ditampilkan, kunci buffer untuk mengaksesnya. Gunakan perintah berikut untuk menggunakan kunci kanvas:
lockCanvas()
mengunci buffer untuk rendering di CPU dan menampilkan Canvas untuk digunakan dalam menggambar.unlockCanvasAndPost()
membuka kunci buffer dan mengirimkannya ke compositor.lockHardwareCanvas()
mengunci buffer untuk rendering di GPU dan menampilkan kanvas yang akan digunakan untuk menggambar.
Saat produsen meminta buffer dari BufferQueue untuk pertama kalinya, buffer akan dialokasikan dan diinisialisasi menjadi nol. Inisialisasi diperlukan untuk menghindari
berbagi data secara tidak sengaja antar-proses. Namun, jika Anda menggunakan kembali buffer,
konten sebelumnya masih ada. Jika Anda memanggil
lockCanvas()
dan unlockCanvasAndPost()
berulang kali tanpa
menggambar apa pun, produser akan berganti-ganti antara frame yang dirender sebelumnya.
Kode buka/kunci platform menyimpan referensi ke buffer yang dirender sebelumnya. Jika Anda menentukan region kotor saat mengunci permukaan, piksel yang tidak kotor akan disalin dari buffer sebelumnya. SurfaceFlinger atau HWC biasanya menangani buffer; tetapi karena Anda hanya perlu membaca dari buffer, Anda tidak perlu menunggu akses eksklusif.
SurfaceHolder
SurfaceHolder adalah antarmuka yang digunakan sistem untuk berbagi kepemilikan permukaan dengan aplikasi. Beberapa klien yang bekerja dengan platform menginginkan SurfaceHolder, karena API untuk mendapatkan dan menyetel parameter platform 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.