Grafik

Ikon HAL Grafik Android

Framework Android menawarkan berbagai API rendering grafis untuk 2D dan 3D yang berinteraksi dengan implementasi driver grafis dari produsen, sehingga penting untuk memiliki pemahaman yang baik tentang cara kerja API tersebut di tingkat yang lebih tinggi. Halaman ini memperkenalkan hardware abstraction layer (HAL) grafis yang digunakan untuk membuat driver tersebut. Sebelum melanjutkan bagian ini, pahami istilah berikut:

kanvas (istilah umum), Canvas (elemen API)
Kanvas adalah permukaan gambar yang menangani pengomposisian bit aktual terhadap objek bitmap atau Surface. Class Canvas memiliki metode untuk gambar komputer standar bitmap, garis, lingkaran, persegi panjang, teks, dan sebagainya, dan terikat pada bitmap atau permukaan. Kanvas adalah cara termudah dan paling sederhana untuk menggambar objek 2D di layar. Class dasarnya adalah Canvas.
drawable
Drawable adalah resource visual terkompilasi yang dapat digunakan sebagai latar belakang, judul, atau bagian lain dari layar. Drawable biasanya dimuat ke elemen UI lain, misalnya sebagai gambar latar. Drawable tidak dapat menerima peristiwa, tetapi menetapkan berbagai properti lain seperti status dan penjadwalan, untuk mengaktifkan subclass seperti objek animasi atau library gambar. Banyak objek drawable yang dimuat dari file resource drawable — dan file XML atau bitmap yang mendeskripsikan gambar. Resource drawable akan dikompilasi menjadi subclass dari android.graphics.drawable. Untuk mengetahui informasi selengkapnya tentang drawable dan resource lainnya, lihat Ringkasan resource aplikasi.
resource tata letak
Resource tata letak adalah file XML yang mendeskripsikan tata letak layar aktivitas. Untuk mengetahui informasi selengkapnya, lihat Resource tata letak.
nine-patch (9-patch, NinePatch)
Nine-patch adalah resource bitmap yang dapat diubah ukurannya yang dapat digunakan untuk latar belakang atau gambar lain di perangkat. Untuk mengetahui informasi selengkapnya, lihat Nine-patch.
OpenGL ES
OpenGL ES adalah API lintas platform untuk merender grafis 2D dan 3D. Android menyediakan library OpenGL ES untuk rendering 3D yang dipercepat hardware. Untuk rendering 2D kanvas adalah opsi yang lebih sederhana. OpenGL ES tersedia di Android Native Development Kit (NDK). Paket android.opengl dan javax.microedition.khronos.opengles memaparkan fungsi OpenGL ES.
permukaan (istilah umum), Surface (elemen API)
Permukaan mewakili blok memori yang akan digabungkan ke layar. Permukaan menyimpan kanvas untuk menggambar, dan menyediakan berbagai metode helper untuk menggambar lapisan dan mengubah ukuran objek Surface. Gunakan class SurfaceView bukan class Surface secara langsung.
tampilan permukaan (istilah umum), SurfaceView (elemen API)
Tampilan permukaan adalah objek View yang menggabungkan objek Surface untuk menggambar, dan menampilkan metode guna menentukan ukuran dan formatnya secara dinamis. Tampilan permukaan menyediakan cara untuk menggambar secara terpisah dari UI thread untuk operasi yang memerlukan banyak resource, seperti game atau pratinjau kamera, tetapi tampilan permukaan menggunakan memori tambahan sebagai akibatnya. Tampilan permukaan mendukung grafis kanvas dan OpenGL ES. Class dasar untuk objek SurfaceView adalah SurfaceView.
tema
Tema adalah kumpulan properti, seperti ukuran teks dan warna latar belakang, yang dipaketkan bersama untuk menentukan berbagai setelan tampilan default. Android menyediakan beberapa tema standar, yang tercantum dalam R.style dan diawali dengan Theme_.
tampilan (istilah umum), View (elemen API)
Tampilan menggambar area persegi panjang di layar dan menangani klik, tombol, dan peristiwa interaksi lainnya. Class View adalah class dasar untuk sebagian besar komponen tata letak layar aktivitas atau dialog, seperti kotak teks dan jendela. Objek View menerima panggilan dari objek induknya (lihat ViewGroup) untuk menggambar dirinya sendiri, dan memberi tahu objek induknya tentang ukuran dan lokasi yang diinginkannya, yang mungkin tidak diterima oleh induknya. Untuk mengetahui informasi selengkapnya, lihat View.
kelompok tampilan (istilah umum), ViewGroup (elemen API)
Kelompok tampilan mengelompokkan sekumpulan tampilan turunan. Grup tampilan bertanggung jawab untuk menentukan letak tampilan turunan dan seberapa besar ukurannya, serta untuk memanggil masing-masing tampilan untuk menggambar sendiri bila perlu. Beberapa grup tampilan tidak terlihat dan hanya untuk tata letak, sementara grup lainnya memiliki UI intrinsik, seperti kotak daftar scrolling. Grup tampilan berada dalam paket android.widget tetapi memperluas ViewGroup class.
hierarki tampilan
Hierarki tampilan adalah susunan objek tampilan dan kelompok tampilan yang menentukan antarmuka pengguna untuk setiap komponen aplikasi. Hierarki terdiri dari kelompok tampilan yang berisi satu atau beberapa tampilan turunan atau kelompok tampilan. Anda dapat memperoleh representasi visual hierarki tampilan untuk proses debug dan pengoptimalan dengan menggunakan Hierarchy Viewer yang disertakan dengan Android SDK.
Vulkan
Vulkan adalah API lintas platform dengan overhead rendah untuk grafis 3D berperforma tinggi.
widget
Widget adalah salah satu dari kumpulan subclass tampilan yang diterapkan sepenuhnya yang merender elemen formulir elemen dan komponen UI lainnya, seperti kotak teks atau menu pop-up. Karena diterapkan sepenuhnya, widget akan mengukur, menggambar sendiri, dan merespons peristiwa layar. Widget berada dalam android.widget paket.
jendela (istilah umum), Window (elemen API)
Di aplikasi Android, jendela adalah objek yang berasal dari Window class abstrak yang menentukan elemen jendela umum, seperti tampilan dan nuansa, teks panel judul, serta lokasi dan konten menu. Dialog dan aktivitas menggunakan penerapan class Window untuk merender objek Window. Anda tidak perlu menerapkan class Window atau menggunakan jendela di aplikasi Anda.

Developer aplikasi menggambar gambar ke layar dengan tiga cara: dengan Canvas, OpenGL ES, atau Vulkan.

Komponen grafis Android

Apa pun API rendering yang digunakan developer, semuanya dirender ke permukaan. Permukaan mewakili sisi produsen dari antrean buffer yang sering digunakan oleh SurfaceFlinger. Setiap jendela yang dibuat di platform Android didukung oleh permukaan. Semua permukaan yang terlihat yang dirender digabungkan ke layar oleh SurfaceFlinger.

Diagram berikut menunjukkan cara kerja komponen utama:

komponen rendering gambar

Gambar 1. Cara permukaan dirender.

Komponen utama dijelaskan di bagian berikut.

Produsen aliran gambar

Produsen aliran gambar dapat berupa apa saja yang menghasilkan buffer grafis untuk penggunaan. Contohnya mencakup OpenGL ES, Canvas 2D, dan dekoder video mediaserver.

Konsumen aliran gambar

Konsumen aliran gambar yang paling umum adalah SurfaceFlinger, layanan sistem yang menggunakan permukaan yang saat ini terlihat dan menggabungkannya ke layar menggunakan informasi yang diberikan oleh Pengelola Jendela. SurfaceFlinger adalah satu-satunya layanan yang dapat mengubah konten layar. SurfaceFlinger menggunakan OpenGL dan Hardware Composer (HWC) untuk menggabungkan grup permukaan.

Aplikasi OpenGL ES lainnya juga dapat menggunakan aliran gambar, seperti aplikasi kamera yang menggunakan aliran gambar pratinjau kamera. Aplikasi non-GL juga dapat menjadi konsumen, misalnya class ImageReader.

Hardware Composer

Abstraksi hardware untuk subsistem tampilan. SurfaceFlinger dapat mendelegasikan pekerjaan komposisi tertentu ke HWC untuk mengurangi beban kerja dari OpenGL dan GPU. SurfaceFlinger bertindak sebagai klien OpenGL ES lainnya. Jadi, saat SurfaceFlinger secara aktif menggabungkan satu atau dua buffer menjadi yang ketiga, misalnya, SurfaceFlinger menggunakan OpenGL ES. Hal ini membuat pengomposisian daya lebih rendah daripada GPU yang melakukan semua komputasi.

The Hardware Composer HAL melakukan setengah pekerjaan lainnya dan merupakan titik pusat untuk semua rendering grafis Android. HWC harus mendukung peristiwa, salah satunya adalah VSync (yang lainnya adalah hotplug untuk dukungan HDMI plug-and-play).

Gralloc

Pengalokasi memori grafis (Gralloc) diperlukan untuk mengalokasikan memori yang diminta oleh produsen gambar. Untuk mengetahui detailnya, lihat BufferQueue dan Gralloc.

Aliran data

Diagram berikut menggambarkan pipeline grafis Android:

alur data grafis

Gambar 2. Aliran data grafis melalui Android.

Objek di sebelah kiri adalah renderer yang menghasilkan buffer grafis, seperti layar utama, status bar, dan UI sistem. SurfaceFlinger adalah compositor dan HWC adalah composer.

BufferQueue

BufferQueue menyediakan perekat antara komponen grafis Android. Ini adalah sepasang antrean yang memediasi siklus buffer konstan dari produsen ke konsumen. Setelah produsen menyerahkan buffer mereka, SurfaceFlinger bertanggung jawab untuk menggabungkan semuanya ke layar.

Diagram berikut menggambarkan proses komunikasi BufferQueue:

Proses komunikasi BufferQueue

Gambar 3. Proses komunikasi BufferQueue.

BufferQueue berisi logika yang mengikat produsen aliran gambar dan konsumen aliran gambar. Beberapa contoh produsen gambar adalah pratinjau kamera yang dihasilkan oleh HAL kamera atau game OpenGL ES. Beberapa contoh konsumen gambar adalah SurfaceFlinger atau aplikasi lain yang menampilkan aliran OpenGL ES, seperti aplikasi kamera yang menampilkan jendela bidik kamera.

BufferQueue adalah struktur data yang menggabungkan kumpulan buffer dengan antrean dan menggunakan komunikasi antar-proses (IPC) Binder untuk meneruskan buffer antar-proses. Antarmuka produsen, atau apa yang Anda teruskan kepada seseorang yang ingin membuat buffer grafis, adalah IGraphicBufferProducer (bagian dari SurfaceTexture). BufferQueue sering digunakan untuk merender ke Surface dan menggunakan GL Consumer, di antara tugas lainnya.

BufferQueue dapat beroperasi dalam tiga mode berbeda:

mode seperti sinkron
BufferQueue secara default beroperasi dalam mode seperti sinkron, yang mana setiap buffer yang masuk dari produsen akan keluar di konsumen. Tidak ada buffer yang pernah dibuang dalam mode ini. Jika produsen terlalu cepat dan membuat buffer lebih cepat daripada yang dikuras, produsen akan diblokir dan menunggu buffer gratis.
mode non-blocking
BufferQueue juga dapat beroperasi dalam mode non-blocking yang menghasilkan error, bukan menunggu buffer dalam kasus tersebut. Tidak ada buffer yang pernah dibuang dalam mode ini. Hal ini berguna untuk menghindari potensi deadlock dalam software aplikasi yang mungkin tidak memahami dependensi kompleks framework grafis.
mode buang
BufferQueue dapat dikonfigurasi untuk membuang buffer lama, bukan menghasilkan error atau menunggu. Misalnya, jika melakukan rendering GL ke tampilan tekstur dan menggambar secepat mungkin, buffer harus dihilangkan.

Untuk melakukan sebagian besar pekerjaan ini, SurfaceFlinger bertindak sebagai klien OpenGL ES lainnya. Jadi, saat SurfaceFlinger secara aktif menggabungkan satu atau dua buffer menjadi yang ketiga, misalnya, SurfaceFlinger menggunakan OpenGL ES.

Hardware Composer HAL melakukan setengah pekerjaan lainnya. HAL ini bertindak sebagai titik pusat untuk semua rendering grafis Android.