Grafik

Ikon HAL Grafik Android

Kerangka kerja Android menawarkan beragam API rendering grafis untuk 2D dan 3D yang berinteraksi dengan implementasi driver grafis dari pabrikan, jadi penting untuk memiliki pemahaman yang baik tentang cara kerja API tersebut pada tingkat yang lebih tinggi. Halaman ini memperkenalkan lapisan abstraksi perangkat keras grafis (HAL) yang menjadi dasar pembuatan driver tersebut. Sebelum melanjutkan ke bagian ini, kenali istilah-istilah berikut ini:

kanvas (istilah umum), Canvas (elemen API)
Kanvas adalah permukaan gambar yang menangani pengomposisian bit aktual terhadap bitmap atau objek Surface . Canvas memiliki metode untuk menggambar bitmap, garis, lingkaran, persegi panjang, teks, dan sebagainya pada komputer standar, dan terikat pada bitmap atau permukaan. Kanvas adalah cara paling sederhana dan termudah untuk menggambar objek 2D di layar. Kelas dasarnya adalah Canvas .
dapat digambar
Sumber daya dapat digambar adalah sumber daya visual terkompilasi yang dapat digunakan sebagai latar belakang, judul, atau bagian lain dari layar. Sumber daya dapat digambar biasanya dimuat ke elemen UI lain, misalnya sebagai gambar latar belakang. Sumber daya dapat digambar tidak dapat menerima peristiwa, namun menetapkan berbagai properti lain seperti status dan penjadwalan, untuk mengaktifkan subkelas seperti objek animasi atau pustaka gambar. Banyak objek drawable diambil dari file sumber daya drawable — file XML atau bitmap yang mendeskripsikan gambar. Sumber daya dapat digambar dikompilasi ke dalam subkelas android.graphics.drawable . Untuk informasi selengkapnya tentang sumber daya dapat digambar dan sumber daya lainnya, lihat Sumberdaya .
sumber daya tata letak
Sumber daya tata letak adalah file XML yang menjelaskan tata letak layar aktivitas. Untuk informasi selengkapnya, lihat Sumber daya tata letak .
sembilan tambalan (9 tambalan, SembilanPatch)
Nine-patch adalah sumber daya bitmap yang dapat diubah ukurannya dan dapat digunakan untuk latar belakang atau gambar lain di perangkat. Untuk informasi lebih lanjut, lihat Sembilan-patch .
OpenGL ES
OpenGL ES adalah API lintas platform untuk merender grafik 2D dan 3D. Android menyediakan pustaka OpenGL ES untuk rendering 3D yang dipercepat perangkat keras. Untuk rendering 2D, kanvas adalah pilihan yang lebih sederhana. OpenGL ES tersedia di Android Native Development Kit (NDK) . Paket android.opengl dan javax.microedition.khronos.opengles mengekspos fungsionalitas OpenGL ES.
permukaan (istilah umum), Surface (elemen API)
Permukaan mewakili blok memori yang digabungkan ke layar. Permukaan menampung kanvas untuk menggambar, dan menyediakan berbagai metode pembantu untuk menggambar lapisan dan mengubah ukuran objek Surface . Gunakan kelas SurfaceView alih-alih kelas Surface secara langsung.
tampilan permukaan (istilah umum), SurfaceView (elemen API)
Tampilan permukaan adalah objek View yang membungkus objek Surface untuk digambar, dan memperlihatkan metode untuk menentukan ukuran dan formatnya secara dinamis. Tampilan permukaan menyediakan cara untuk menggambar secara independen dari thread UI untuk pengoperasian yang membutuhkan banyak sumber daya, seperti game atau pratinjau kamera, namun sebagai hasilnya, tampilan ini menggunakan memori ekstra. Tampilan permukaan mendukung grafis kanvas dan OpenGL ES. Kelas dasar untuk objek SurfaceView adalah SurfaceView .
tema
Tema adalah sekumpulan properti, seperti ukuran teks dan warna latar belakang, yang digabungkan untuk menentukan berbagai pengaturan tampilan default. Android menyediakan beberapa tema standar, tercantum dalam R.style dan diawali dengan Theme_ .
view (istilah umum), View (elemen API)
Tampilan menggambar area persegi panjang di layar dan menangani klik, penekanan tombol, dan peristiwa interaksi lainnya. Kelas View adalah kelas 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 menginformasikan objek induknya tentang ukuran dan lokasi yang diinginkan, yang mungkin tidak dipatuhi oleh objek induknya. Untuk informasi lebih lanjut, lihat View .
grup tampilan (istilah umum), ViewGroup (elemen API)
Grup tampilan mengelompokkan sekumpulan tampilan anak. Kelompok tampilan bertanggung jawab untuk memutuskan di mana posisi tampilan anak dan seberapa besar ukurannya, serta memanggil masing-masing tampilan untuk menggambar dirinya sendiri jika diperlukan. Beberapa grup tampilan tidak terlihat dan hanya untuk tata letak, sementara grup tampilan lainnya memiliki UI intrinsik, seperti kotak daftar bergulir. Grup tampilan ada dalam paket widget , tetapi perluas kelas ViewGroup .
melihat hierarki
Hierarki tampilan adalah susunan objek grup tampilan dan tampilan yang mendefinisikan antarmuka pengguna untuk setiap komponen aplikasi. Hirarki terdiri dari grup tampilan yang berisi satu atau beberapa tampilan anak atau grup tampilan. Anda bisa mendapatkan representasi visual hierarki tampilan untuk proses debug dan pengoptimalan dengan menggunakan Hierarchy Viewer yang disertakan dengan Android SDK.
Vulkan
Vulkan adalah API lintas platform overhead rendah untuk grafis 3D performa tinggi.
widget
Widget adalah salah satu kumpulan subkelas tampilan yang diimplementasikan sepenuhnya yang merender elemen formulir dan komponen UI lainnya, seperti kotak teks atau menu popup. Karena widget diimplementasikan sepenuhnya, widget menangani pengukuran, menggambar sendiri, dan merespons peristiwa di layar. Widget ada dalam paket android.widget .
jendela (istilah umum), Window (elemen API)
Dalam aplikasi Android, jendela adalah objek turunan dari kelas abstrak Window yang menentukan elemen jendela generik, seperti tampilan dan nuansa, teks bilah judul, serta lokasi dan konten menu. Dialog dan aktivitas menggunakan implementasi kelas Window untuk merender objek Window . Anda tidak perlu mengimplementasikan kelas Window atau menggunakan windows di aplikasi Anda.

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

Komponen grafis Android

Apa pun rendering API yang digunakan pengembang, semuanya dirender ke permukaan. Permukaan mewakili sisi produsen dari antrian buffer yang sering digunakan oleh SurfaceFlinger. Setiap jendela yang dibuat pada platform Android didukung oleh sebuah permukaan. Semua permukaan terlihat yang dirender digabungkan ke dalam layar oleh SurfaceFlinger.

Diagram berikut menunjukkan bagaimana komponen-komponen utama bekerja sama:

komponen rendering gambar

Gambar 1. Bagaimana permukaan dirender.

Komponen utama dijelaskan di bawah ini:

Produser aliran gambar

Produsen aliran gambar dapat berupa apa saja yang menghasilkan buffer grafis untuk dikonsumsi. Contohnya termasuk OpenGL ES, Canvas 2D, dan dekoder video server media.

Konsumen aliran gambar

Konsumen aliran gambar yang paling umum adalah SurfaceFlinger, layanan sistem yang menggunakan permukaan yang terlihat saat ini dan menggabungkannya ke tampilan menggunakan informasi yang disediakan oleh Window Manager. SurfaceFlinger adalah satu-satunya layanan yang dapat mengubah konten tampilan. SurfaceFlinger menggunakan OpenGL dan Komposer Perangkat Keras untuk menyusun sekelompok permukaan.

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

Komposer Perangkat Keras

Abstraksi perangkat keras untuk subsistem tampilan. SurfaceFlinger dapat mendelegasikan pekerjaan komposisi tertentu ke Komposer Perangkat Keras untuk memindahkan pekerjaan dari OpenGL dan GPU. SurfaceFlinger bertindak hanya sebagai klien OpenGL ES lainnya. Jadi ketika SurfaceFlinger secara aktif menggabungkan satu atau dua buffer menjadi buffer ketiga, misalnya, ia menggunakan OpenGL ES. Hal ini membuat pengomposisian memiliki daya yang lebih rendah dibandingkan membiarkan GPU melakukan semua komputasi.

Komposer Perangkat Keras HAL melakukan separuh pekerjaan lainnya dan merupakan titik sentral untuk semua rendering grafis Android. Komposer Perangkat Keras harus mendukung acara, salah satunya adalah VSYNC (yang lainnya adalah hotplug untuk dukungan plug-and-playHDMI).

Gralloc

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

Aliran data

Lihat diagram berikut untuk gambaran pipeline grafis Android:

aliran data grafis

Gambar 2. Aliran data grafis melalui Android

Objek di sebelah kiri adalah penyaji yang menghasilkan buffer grafis, seperti layar beranda, bilah status, dan UI sistem. SurfaceFlinger adalah komposernya dan Komposer Perangkat Keras adalah komposernya.

Antrian Penyangga

BufferQueues menyediakan perekat antara komponen grafis Android. Ini adalah sepasang antrian yang memediasi siklus buffer yang konstan dari produsen ke konsumen. Setelah produsen menyerahkan buffer mereka, SurfaceFlinger bertanggung jawab untuk menyusun semuanya ke dalam tampilan.

Lihat diagram berikut untuk proses komunikasi BufferQueue.

Proses komunikasi BufferQueue

Gambar 3. Proses komunikasi BufferQueue

BufferQueue berisi logika yang menyatukan produsen aliran gambar dan konsumen aliran gambar. Beberapa contoh penghasil gambar adalah pratinjau kamera yang dihasilkan oleh kamera HAL 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 antrian dan menggunakan Binder IPC untuk meneruskan buffer antar proses. Antarmuka produser, atau apa yang Anda sampaikan 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-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 keluar ke konsumen. Tidak ada buffer yang dibuang dalam mode ini. Dan jika produser terlalu cepat dan membuat buffer lebih cepat daripada yang terkuras, ia akan memblokir dan menunggu buffer gratis.

Mode non-pemblokiran - BufferQueue juga dapat beroperasi dalam mode non-pemblokiran yang menghasilkan kesalahan daripada menunggu buffer dalam kasus tersebut. Tidak ada buffer yang dibuang dalam mode ini. Hal ini berguna untuk menghindari potensi kebuntuan dalam perangkat lunak aplikasi yang mungkin tidak memahami ketergantungan kompleks kerangka grafis.

Mode Buang - Terakhir, BufferQueue dapat dikonfigurasi untuk membuang buffer lama daripada menghasilkan kesalahan atau menunggu. Misalnya, jika melakukan rendering GL ke tampilan tekstur dan menggambar secepat mungkin, buffer harus dihilangkan.

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

Komposer Perangkat Keras HAL melakukan separuh pekerjaan lainnya. HAL ini bertindak sebagai titik pusat untuk semua rendering grafis Android.