Grafik

Ikon HAL Grafik Android

Framework Android menawarkan berbagai API rendering grafis untuk 2D dan 3D yang berinteraksi dengan implementasi driver grafis 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 ke bagian ini, pahami istilah berikut:

kanvas (istilah umum), Canvas (elemen API)
Kanvas adalah platform gambar yang menangani pengomposisian bit aktual terhadap bitmap atau objek Surface. Canvas memiliki metode untuk gambar komputer standar bitmap, garis, lingkaran, persegi panjang, teks, dan sebagainya, dan terikat pada bitmap atau platform. 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 — file XML atau bitmap yang mendeskripsikan gambar. Resource drawable dikompilasi menjadi subclass android.graphics.drawable. Untuk informasi selengkapnya tentang drawable dan resource lainnya, lihat Resource.
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 mengekspos fungsi OpenGL ES.
platform (istilah umum), Surface (elemen API)
Platform mewakili blok memori yang digabungkan ke layar. Platform menyimpan kanvas untuk menggambar, dan menyediakan berbagai metode bantuan untuk menggambar lapisan dan mengubah ukuran objek Surface. Gunakan class SurfaceView sebagai ganti class Surface secara langsung.
tampilan platform (istilah umum), SurfaceView (elemen API)
Tampilan platform adalah objek View yang menggabungkan objek Surface untuk menggambar, dan menampilkan metode untuk menentukan ukuran dan formatnya secara dinamis. Tampilan platform 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 hasilnya. Tampilan platform mendukung grafis kanvas dan OpenGL ES. Class dasar untuk objek SurfaceView adalah SurfaceView.
theme
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 diinginkan, yang mungkin tidak dipatuhi oleh induk. Untuk 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 jika perlu. Beberapa grup tampilan tidak terlihat dan hanya untuk tata letak, sementara grup lainnya memiliki UI intrinsik, seperti kotak daftar scroll. Grup tampilan berada dalam paket widget, tetapi memperluas class ViewGroup.
hierarki tampilan
Hierarki tampilan adalah pengaturan 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 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 sekumpulan 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 menangani pengukuran, menggambar sendiri, dan merespons peristiwa layar. Widget ada dalam paket android.widget.
window (istilah umum), Window (elemen API)
Di 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 Kanvas, OpenGL ES, atau Vulkan.

Komponen grafis Android

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

Diagram berikut menunjukkan cara kerja komponen utama:

komponen rendering gambar

Gambar 1. Cara platform dirender.

Komponen utamanya dijelaskan di bawah ini:

Produsen aliran gambar

Produsen streaming gambar dapat berupa apa pun yang menghasilkan buffering grafis untuk konsumsi. Contohnya termasuk dekoder video OpenGL ES, Canvas 2D, dan mediaserver.

Konsumen aliran data gambar

Pengguna aliran gambar yang paling umum adalah SurfaceFlinger, layanan sistem yang menggunakan platform yang saat ini terlihat dan menggabungkannya ke layar menggunakan informasi yang disediakan oleh Pengelola Jendela. SurfaceFlinger adalah satu-satunya layanan yang dapat mengubah konten layar. SurfaceFlinger menggunakan OpenGL dan Hardware Composer untuk menyusun grup platform.

Aplikasi OpenGL ES lainnya juga dapat menggunakan streaming gambar, seperti aplikasi kamera yang menggunakan streaming 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 Hardware Composer untuk memindahkan pekerjaan dari OpenGL dan GPU. SurfaceFlinger bertindak sebagai klien OpenGL ES lainnya. Jadi, saat SurfaceFlinger secara aktif mengomposisi satu atau dua buffering menjadi buffering ketiga, misalnya, SurfaceFlinger menggunakan OpenGL ES. Hal ini membuat kompilasi lebih hemat daya daripada meminta GPU melakukan semua komputasi.

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

Gralloc

Allocator memori grafis (Gralloc) diperlukan untuk mengalokasikan memori yang diminta oleh produsen gambar. Untuk mengetahui detailnya, lihat Gralloc HAL.

Aliran data

Lihat diagram berikut untuk penggambaran pipeline grafis Android:

alur data grafis

Gambar 2. Aliran data grafis melalui Android

Objek di sebelah kiri adalah perender yang menghasilkan buffering grafis, seperti layar utama, status bar, dan UI sistem. SurfaceFlinger adalah komposer dan Hardware Composer adalah komposer.

BufferQueue

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

Lihat diagram berikut untuk proses komunikasi BufferQueue.

Proses komunikasi BufferQueue

Gambar 3. Proses komunikasi BufferQueue

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

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

BufferQueue dapat beroperasi dalam tiga mode berbeda:

Mode mirip sinkron - BufferQueue secara default beroperasi dalam mode mirip sinkron, dengan setiap buffering yang masuk dari produsen keluar di konsumen. Tidak ada buffering yang dihapus dalam mode ini. Selain itu, jika produser terlalu cepat dan membuat buffering lebih cepat daripada dikosongkan, buffering akan diblokir dan menunggu buffering gratis.

Mode non-pemblokiran - BufferQueue juga dapat beroperasi dalam mode non-pemblokiran yang menghasilkan error, bukan menunggu buffer dalam kasus tersebut. Buffer juga tidak akan dihapus dalam mode ini. Hal ini berguna untuk menghindari potensi deadlock dalam software aplikasi yang mungkin tidak memahami dependensi kompleks framework grafis.

Mode hapus - Terakhir, BufferQueue dapat dikonfigurasi untuk menghapus buffer lama, bukan menghasilkan error atau menunggu. Misalnya, jika melakukan rendering GL ke tampilan tekstur dan menggambar secepat mungkin, buffering harus dihapus.

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

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