Arsitektur grafis

Yang harus diketahui setiap developer tentang platform, 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 cara buffer data grafis bergerak melalui sistem. Jika Anda pernah bertanya-tanya mengapa SurfaceView dan TextureView berperilaku seperti itu, atau bagaimana interaksi antara permukaan dan EGLSurface, Anda berada di tempat yang tepat.

Anda dianggap sudah memahami perangkat Android dan pengembangan aplikasi. Anda tidak memerlukan pengetahuan mendetail tentang framework aplikasi dan hanya sedikit panggilan API yang disebutkan, tetapi materi tidak tumpang-tindih dengan dokumentasi publik lainnya. Tujuannya adalah untuk memberikan detail tentang peristiwa penting yang terlibat dalam merender frame untuk output guna membantu Anda membuat pilihan yang tepat saat mendesain aplikasi. Untuk mencapai tujuan ini, dokumen ini disusun dari bawah ke atas, yang menjelaskan cara kerja class UI, bukan cara menggunakannya.

Bagian ini mencakup beberapa halaman yang membahas semuanya mulai dari materi latar belakang hingga detail HAL hingga kasus penggunaan. Bagian ini dimulai dengan penjelasan tentang buffer grafis Android, menjelaskan mekanisme komposisi dan tampilan, lalu melanjutkan ke mekanisme tingkat yang lebih tinggi yang menyediakan data ke compositor. Sebaiknya baca halaman dalam urutan berikut, bukan langsung membuka topik yang menarik.

Komponen tingkat rendah

  • BufferQueue dan gralloc. BufferQueue menghubungkan sesuatu yang menghasilkan buffer data grafis (produser) dengan 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, Hardware Composer, dan tampilan virtual. SurfaceFlinger menerima buffer data dari beberapa sumber, menggabungkannya, dan mengirimkannya ke layar. HAL Hardware Composer (HWC) menentukan cara paling efisien untuk menggabungkan buffer dengan hardware yang tersedia, dan layar virtual membuat output gabungan tersedia dalam sistem (merekam layar atau mengirim layar melalui jaringan).
  • Surface, canvas, dan SurfaceHolder. Permukaan menghasilkan antrean buffer yang sering digunakan oleh SurfaceFlinger. Saat merender ke permukaan, hasilnya akan berada di buffer yang dikirim ke konsumen. API Canvas menyediakan implementasi software (dengan dukungan akselerasi hardware) untuk menggambar langsung di permukaan (alternatif tingkat rendah untuk OpenGL ES). Semua yang berkaitan dengan tampilan melibatkan SurfaceHolder, yang API-nya memungkinkan pengambilan dan penyetelan parameter permukaan seperti ukuran dan format.
  • EGLSurface dan OpenGL ES. OpenGL ES (GLES) mendefinisikan API rendering grafis yang dirancang untuk digabungkan dengan EGL, sebuah library 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 membahas ANativeWindow, yang merupakan padanan C/C++ dari class Surface Java yang digunakan untuk membuat permukaan jendela EGL dari kode native.
  • Vulkan. Vulkan adalah API lintas platform dengan overhead rendah untuk grafis 3D berperforma tinggi. Seperti OpenGL ES, Vulkan menyediakan alat untuk membuat grafis real-time berkualitas tinggi di aplikasi. Keunggulan Vulkan mencakup pengurangan overhead CPU dan dukungan untuk bahasa SPIR-V Binary Intermediate.

Komponen tingkat tinggi

  • SurfaceView dan GLSurfaceView. SurfaceView menggabungkan permukaan dan tampilan. Komponen tampilan SurfaceView dikomposisikan oleh SurfaceFlinger (dan bukan aplikasi), sehingga memungkinkan rendering dari thread/proses terpisah dan isolasi dari rendering UI aplikasi. GLSurfaceView menyediakan class helper untuk mengelola konteks EGL, komunikasi antar-thread, dan interaksi dengan siklus proses aktivitas (tetapi tidak diperlukan untuk menggunakan GLES).
  • SurfaceTexture. SurfaceTexture menggabungkan permukaan dan tekstur GLES untuk membuat BufferQueue yang aplikasi Anda adalah konsumennya. Saat produsen mengantrekan buffer baru, produsen akan memberi tahu aplikasi Anda, yang pada gilirannya akan melepaskan buffer yang sebelumnya ditahan, mendapatkan buffer baru dari antrean, dan melakukan panggilan EGL untuk membuat buffer tersedia bagi GLES sebagai tekstur eksternal. Android 7.0 menambahkan dukungan untuk pemutaran video tekstur aman yang memungkinkan pemrosesan pasca-GPU konten video yang dilindungi.
  • TextureView. TextureView menggabungkan tampilan dengan SurfaceTexture. TextureView membungkus SurfaceTexture dan bertanggung jawab untuk merespons callback dan mendapatkan buffer baru. Saat menggambar, TextureView menggunakan konten buffer yang baru-baru ini diterima sebagai sumber datanya, merender di mana pun dan bagaimana pun status tampilan menunjukkannya. Komposisi tampilan selalu dilakukan dengan GLES, yang berarti pembaruan pada konten dapat menyebabkan elemen tampilan lain digambar ulang juga.