arsitektur grafis

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

Halaman ini menjelaskan elemen penting dari arsitektur grafis tingkat sistem Android dan bagaimana elemen tersebut digunakan oleh kerangka kerja 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.

Beberapa keakraban dengan perangkat Android dan pengembangan aplikasi diasumsikan. Anda tidak memerlukan pengetahuan mendetail tentang kerangka kerja aplikasi dan sangat sedikit panggilan API yang disebutkan, tetapi materinya tidak tumpang tindih dengan dokumentasi publik lainnya. Tujuannya adalah untuk memberikan detail tentang peristiwa penting yang terlibat dalam rendering bingkai untuk keluaran guna membantu Anda membuat pilihan yang tepat saat mendesain aplikasi. Untuk mencapai ini, kami bekerja dari bawah ke atas, menjelaskan cara kerja kelas UI daripada bagaimana mereka dapat digunakan.

Bagian ini mencakup beberapa halaman yang mencakup semuanya, mulai dari materi latar belakang hingga detail HAL hingga kasus penggunaan. Dimulai dengan penjelasan buffer grafis Android, menjelaskan komposisi dan mekanisme tampilan, kemudian berlanjut ke mekanisme tingkat yang lebih tinggi yang memasok data ke penyusun. Kami merekomendasikan membaca halaman dalam urutan yang tercantum di bawah ini daripada melompat ke topik yang terdengar 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 output gabungan tersedia di dalam sistem (merekam layar atau mengirim layar melalui jaringan).
  • Permukaan, kanvas, dan SurfaceHolder . Sebuah permukaan menghasilkan antrian buffer yang sering dikonsumsi oleh SurfaceFlinger. Saat merender ke permukaan, hasilnya berakhir di buffer yang dikirim 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 mendapatkan dan menyetel parameter permukaan seperti ukuran dan format.
  • EGLSurface dan OpenGL ES . OpenGL ES (GLES) mendefinisikan API rendering grafis yang dirancang untuk digabungkan dengan EGL , pustaka 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 mencakup ANativeWindow, C/C++ setara dengan 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 berperforma tinggi. Seperti OpenGL ES, Vulkan menyediakan alat untuk membuat grafik real-time berkualitas tinggi dalam aplikasi. Keuntungan Vulkan termasuk 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 digabungkan oleh SurfaceFlinger (dan bukan aplikasi), memungkinkan rendering dari utas/proses terpisah dan isolasi dari rendering UI aplikasi. GLSurfaceView menyediakan kelas pembantu untuk mengelola konteks EGL, komunikasi antar utas, dan interaksi dengan siklus hidup aktivitas (tetapi tidak diperlukan untuk menggunakan GLES).
  • Tekstur Permukaan . SurfaceTexture menggabungkan tekstur permukaan dan GLES untuk membuat BufferQueue di mana aplikasi Anda adalah konsumennya. Saat produser mengantre buffer baru, produser akan memberi tahu aplikasi Anda, yang selanjutnya akan melepaskan buffer yang ditahan sebelumnya, memperoleh buffer baru dari antrean, dan membuat panggilan EGL untuk membuat buffer tersedia untuk 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 menanggapi 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 status tampilan menunjukkannya. Komposisi tampilan selalu dilakukan dengan GLES, artinya pembaruan konten dapat menyebabkan elemen tampilan lain juga digambar ulang.