Grafik

Ikon HAL Grafik Android

Framework Android menawarkan berbagai API rendering grafis untuk 2D dan 3D yang berinteraksi dengan implementasi driver grafis dari produsen, jadi penting untuk memahami dengan baik cara kerja API tersebut pada tingkat yang lebih tinggi. Halaman ini memperkenalkan hardware abstraction layer (HAL) grafis yang menjadi dasar pembuatan 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 bitmap atau objek Surface. Class Canvas memiliki metode untuk gambar komputer standar bitmap, garis, lingkaran, persegi panjang, teks, dan sebagainya, dan terikat pada bitmap atau permukaan. Canvas 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 dimuat dari file resource drawable — file XML atau bitmap yang mendeskripsikan gambar. Resource drawable 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 dengan akselerasi 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.
surface (istilah umum), Surface (elemen API)
Permukaan mewakili blok memori yang digabungkan ke layar. Surface 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 menggunakan memori tambahan sebagai akibatnya. Tampilan permukaan mendukung grafis kanvas dan OpenGL ES. Class dasar untuk objek SurfaceView adalah SurfaceView.
tema
Tema adalah serangkaian 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_.
view (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.
grup tampilan (istilah umum), ViewGroup (elemen API)
Grup 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 class ViewGroup.
hierarki tampilan
Hierarki tampilan adalah susunan objek tampilan dan grup tampilan yang menentukan antarmuka pengguna untuk setiap komponen aplikasi. Hierarki terdiri dari grup tampilan yang berisi satu atau beberapa tampilan turunan atau grup tampilan. Anda dapat memperoleh representasi visual hierarki tampilan untuk proses debug dan pengoptimalan dengan menggunakan Penampil Hierarki 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 dan komponen UI lainnya, seperti kotak teks atau menu pop-up. Karena diterapkan sepenuhnya, widget akan mengukur, menggambar sendiri, dan merespons peristiwa layar. Widget ada dalam paket android.widget.
window (istilah umum), Window (elemen API)
Dalam aplikasi Android, jendela adalah objek yang berasal dari class abstrak Window 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 grafik Android

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

Diagram berikut menunjukkan cara kerja komponen utama bersama-sama:

komponen rendering gambar

Gambar 1. Cara platform dirender.

Komponen utama dijelaskan di bagian berikut.

Produsen aliran gambar

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

Konsumen streaming 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 menyusun 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 tugas 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 buffer ketiga, misalnya, SurfaceFlinger menggunakan OpenGL ES. Hal ini membuat komposit menggunakan daya yang lebih rendah daripada GPU yang melakukan semua komputasi.

HAL Hardware Composer melakukan separuh 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 perender yang menghasilkan buffer grafis, seperti layar utama, status bar, dan UI sistem. SurfaceFlinger adalah compositor dan HWC adalah composer.

BufferQueue

BufferQueue menyediakan hubungan antara komponen grafis Android. Ini adalah sepasang antrean yang memediasi siklus buffer yang konstan dari produsen ke konsumen. Setelah produser 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 dengan GL Consumer, di antara tugas lainnya.

BufferQueue dapat beroperasi dalam tiga mode berbeda:

mode seperti sinkron
BufferQueue secara default beroperasi dalam mode seperti sinkron, di 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 dibuang dalam mode ini. Hal ini berguna untuk menghindari potensi kebuntuan dalam software aplikasi yang mungkin tidak memahami dependensi kompleks framework grafis.
mode hapus
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 dihapus.

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

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