Arsitektur grafis

Hal yang harus diketahui setiap developer tentang platform, SurfaceHolder, EGLSurface, SurfaceView, GLSurfaceView, SurfaceTexture, TextureView, SurfaceFlinger, dan Vulkan.

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

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

Bagian ini mencakup beberapa halaman yang membahas segala hal, mulai dari materi latar belakang hingga detail HAL hingga kasus penggunaan. Pembahasan ini dimulai dengan penjelasan buffering grafik Android, menjelaskan mekanisme komposisi dan tampilan, lalu melanjutkan ke mekanisme tingkat tinggi yang menyediakan data untuk kompositor. Sebaiknya baca halaman dalam urutan yang tercantum di bawah, bukan langsung ke topik yang terdengar menarik.

Komponen tingkat rendah

  • BufferQueue dan gralloc. BufferQueue menghubungkan sesuatu yang menghasilkan buffering data grafis (produser) ke sesuatu yang menerima data untuk ditampilkan atau diproses lebih lanjut (konsumen). Alokasi buffering dilakukan melalui alokator memori gralloc yang diimplementasikan melalui antarmuka HAL khusus vendor.
  • SurfaceFlinger, Hardware Composer, dan layar 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, kanvas, dan SurfaceHolder. Platform menghasilkan antrean buffering yang sering digunakan oleh SurfaceFlinger. Saat merender ke platform, hasilnya akan berakhir di buffering yang dikirim ke konsumen. Canvas API menyediakan implementasi software (dengan dukungan akselerasi hardware) untuk menggambar langsung di platform (alternatif level rendah untuk OpenGL ES). Semua hal yang berkaitan dengan tampilan melibatkan SurfaceHolder, yang API-nya memungkinkan mendapatkan dan menetapkan parameter platform seperti ukuran dan format.
  • EGLSurface dan OpenGL ES. OpenGL ES (GLES) menentukan API rendering grafis yang dirancang untuk digabungkan dengan EGL, library yang dapat membuat dan mengakses jendela melalui sistem operasi (untuk menggambar poligon bertekstur, gunakan panggilan GLES; untuk menempatkan rendering di layar, gunakan panggilan EGL). Halaman ini juga membahas ANativeWindow, C/C++ yang setara dengan class Java Surface yang digunakan untuk membuat platform 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 platform dan tampilan. Komponen tampilan SurfaceView digabungkan oleh SurfaceFlinger (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 tekstur platform dan GLES untuk membuat BufferQueue yang aplikasi Anda adalah konsumennya. Saat produsen mengantrekan buffer baru, produsen akan memberi tahu aplikasi Anda, yang pada gilirannya akan merilis buffer yang sebelumnya disimpan, memperoleh buffer baru dari antrean, dan melakukan panggilan EGL untuk membuat buffer tersedia untuk GLES sebagai tekstur eksternal. Android 7.0 menambahkan dukungan untuk pemutaran video tekstur aman yang memungkinkan pascapemrosesan GPU konten video yang dilindungi.
  • TextureView. TextureView menggabungkan tampilan dengan SurfaceTexture. TextureView menggabungkan SurfaceTexture dan bertanggung jawab untuk merespons callback dan mendapatkan buffering baru. Saat menggambar, TextureView menggunakan konten buffer yang baru saja diterima sebagai sumber datanya, yang dirender di mana pun dan bagaimanapun status tampilan menunjukkannya. Komposisi tampilan selalu dilakukan dengan GLES, yang berarti pembaruan pada konten juga dapat menyebabkan elemen tampilan lainnya digambar ulang.