Arsitektur grafis

Apa yang harus diketahui setiap pengembang tentang permukaan, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger, dan Vulkan.

Halaman ini menjelaskan elemen penting arsitektur grafis tingkat sistem Android dan cara penggunaannya oleh framework aplikasi dan sistem multimedia. Fokusnya adalah pada bagaimana buffer data grafis bergerak melalui sistem. Jika Anda pernah bertanya-tanya mengapa SurfaceView dan TextureView berperilaku seperti itu, atau bagaimana permukaan dan EGLSurface berinteraksi, Anda berada di tempat yang tepat.

Diasumsikan sudah familiar dengan perangkat Android dan pengembangan aplikasi. Anda tidak memerlukan pengetahuan mendetail tentang kerangka aplikasi dan sangat sedikit panggilan API yang disebutkan, namun materinya tidak tumpang tindih dengan dokumentasi publik lainnya. Tujuannya adalah untuk memberikan detail tentang peristiwa penting yang terlibat dalam rendering bingkai keluaran guna membantu Anda membuat pilihan yang tepat saat merancang aplikasi. Untuk mencapai hal ini, kami bekerja dari bawah ke atas, menjelaskan cara kerja kelas UI, bukan cara penggunaannya.

Bagian ini mencakup beberapa halaman yang mencakup segala hal mulai dari materi latar belakang hingga detail HAL hingga kasus penggunaan. Dimulai dengan penjelasan tentang buffer grafis Android, menjelaskan komposisi dan mekanisme tampilan, kemudian melanjutkan ke mekanisme tingkat yang lebih tinggi yang memasok data ke kompositor. Kami merekomendasikan membaca halaman dalam urutan yang tercantum di bawah ini daripada melompat ke topik yang kedengarannya menarik.

Komponen tingkat rendah

  • BufferQueue dan gralloc . BufferQueue menghubungkan sesuatu yang menghasilkan buffer data grafis ( produsen ) ke sesuatu yang menerima data untuk ditampilkan atau diproses lebih lanjut ( konsumen ). Alokasi buffer dilakukan melalui pengalokasi memori gralloc yang diimplementasikan melalui antarmuka HAL khusus vendor.
  • SurfaceFlinger, Komposer Perangkat Keras, dan tampilan virtual . SurfaceFlinger menerima buffer data dari berbagai sumber, menggabungkannya, dan mengirimkannya ke layar. Hardware Composer HAL (HWC) menentukan cara paling efisien untuk menggabungkan buffer dengan perangkat keras yang tersedia, dan tampilan virtual membuat keluaran gabungan tersedia dalam sistem (merekam layar atau mengirim layar melalui jaringan).
  • Permukaan, kanvas, dan SurfaceHolder . Permukaan menghasilkan antrian buffer yang sering digunakan oleh SurfaceFlinger. Saat dirender ke permukaan, hasilnya berakhir di buffer yang dikirimkan ke konsumen. Canvas API menyediakan implementasi perangkat lunak (dengan dukungan akselerasi perangkat keras) untuk menggambar langsung di permukaan (alternatif tingkat rendah untuk OpenGL ES). Apa pun yang berkaitan dengan tampilan melibatkan SurfaceHolder, yang API-nya memungkinkan pengambilan dan pengaturan parameter permukaan seperti ukuran dan format.
  • EGLsurface dan OpenGL ES . OpenGL ES (GLES) mendefinisikan API rendering grafis yang dirancang untuk digabungkan dengan EGL , perpustakaan yang dapat membuat dan mengakses jendela melalui sistem operasi (untuk menggambar poligon bertekstur, gunakan panggilan GLES; untuk menampilkan rendering di layar, gunakan panggilan EGL ). Halaman ini juga mencakup ANativeWindow, setara dengan C/C++ dari kelas Java Surface yang digunakan untuk membuat permukaan jendela EGL dari kode asli.
  • Vulkan . Vulkan adalah API lintas platform dengan overhead rendah untuk grafis 3D performa tinggi. Seperti OpenGL ES, Vulkan menyediakan alat untuk membuat grafik real-time berkualitas tinggi dalam aplikasi. Keunggulan Vulkan mencakup pengurangan overhead CPU dan dukungan untuk bahasa Biner Menengah SPIR-V .

Komponen tingkat tinggi

  • SurfaceView dan GLSurfaceView . SurfaceView menggabungkan permukaan dan tampilan. Komponen tampilan SurfaceView digabungkan oleh SurfaceFlinger (dan bukan aplikasi), memungkinkan rendering dari thread/proses terpisah dan isolasi dari rendering UI aplikasi. GLSurfaceView menyediakan kelas pembantu untuk mengelola konteks EGL, komunikasi antar thread, dan interaksi dengan siklus hidup aktivitas (tetapi tidak diperlukan untuk menggunakan GLES).
  • Tekstur permukaan . SurfaceTexture menggabungkan permukaan dan tekstur GLES untuk membuat BufferQueue yang konsumennya adalah aplikasi Anda. Saat produsen mengantrikan buffer baru, ia akan memberi tahu aplikasi Anda, yang selanjutnya akan melepaskan buffer yang disimpan sebelumnya, memperoleh buffer baru dari antrean, dan melakukan panggilan EGL agar buffer tersebut tersedia bagi GLES sebagai tekstur eksternal. Android 7.0 menambahkan dukungan untuk pemutaran video tekstur aman yang memungkinkan GPU pasca-pemrosesan konten video yang dilindungi.
  • Tampilan Tekstur . TextureView menggabungkan tampilan dengan SurfaceTexture. TextureView membungkus SurfaceTexture dan bertanggung jawab untuk merespons panggilan balik dan memperoleh buffer baru. Saat menggambar, TextureView menggunakan konten buffer yang paling baru diterima sebagai sumber datanya, merender di mana pun dan bagaimanapun kondisi tampilan menunjukkan hal tersebut seharusnya. Komposisi tampilan selalu dilakukan dengan GLES, artinya pembaruan konten dapat menyebabkan elemen tampilan lain juga digambar ulang.