Bermigrasi dari RenderScript

RenderScript API tidak digunakan lagi mulai Android 12. API ini akan tetap berfungsi, tetapi kami mengantisipasi produsen perangkat dan komponen akan berhenti menyediakan dukungan akselerasi hardware seiring waktu. Untuk memanfaatkan akselerasi GPU secara optimal, sebaiknya migrasikan skrip Anda ke Vulkan atau gunakan toolkit pengganti kami untuk bermigrasi dari intrinsik.

Bermigrasi dari intrinsik

Meskipun intrinsik RenderScript akan terus berfungsi setelah penghentian RenderScript, fungsi tersebut hanya dapat dijalankan pada CPU, bukan GPU.

Jika aplikasi Anda menggunakan intrinsik, Anda dapat menggunakan library pengganti mandiri; pengujian kami menunjukkan bahwa penggunaan library ini lebih cepat daripada implementasi CPU RenderScript yang sudah ada.

Toolkit ini mencakup fungsi berikut:

  • Perpaduan
  • Pemburaman
  • Matriks warna
  • Konvolusi
  • Histogram dan histogramDot
  • Tabel pemeta (LUT) dan LUT 3D
  • Ubah ukuran
  • YUV ke RGB

Untuk detail dan batasan selengkapnya, lihat file README.md dan Toolkit.kt .

Lakukan langkah-langkah berikut untuk mendownload, menambahkan, dan menggunakan library:

  1. Download project dari GitHub.

  2. Temukan dan buat renderscript-toolkit module.

  3. Tambahkan library ke project Android Studio dengan memodifikasi file build.gradle aplikasi.

  4. Panggil metode yang sesuai dari toolkit.

Contoh: bermigrasi dari fungsi ScriptIntrinsicBlur

Untuk mengganti fungsi ScriptIntrinsicBlur:

  • Untuk memburamkan bitmap, panggil Toolkit.blur.

    var blurredBitmap = Toolkit.blur(myBitmap, radius)
    
  • Jika Anda ingin memburamkan gambar yang diwakili oleh sederet byte, tentukan lebar, tinggi, dan jumlah byte per piksel.

    val outArray = Toolkit.blur(inputArray, bytesPerPixel, width, height, radius)
    

Saat menargetkan Android 12 (API level 31) dan yang lebih tinggi, sebaiknya gunakan class RenderEffect, bukan Toolkit.blur().

Bermigrasi dari skrip

Untuk memanfaatkan akselerasi GPU secara optimal, sebaiknya migrasikan skrip RenderScript ke Vulkan API lintas platform. Meskipun jika tidak dimigrasikan, skrip Anda akan terus berjalan, tetapi skrip tersebut mungkin dieksekusi di CPU, bukan di GPU, bergantung pada ketersediaan driver.

Untuk lebih memahami cara memigrasikan fungsi, tinjau aplikasi contoh. Contoh ini menunjukkan cara memburamkan bitmap dan mengonversi matriks warna di RenderScript, dan memiliki kode yang setara di Vulkan.

Jika aplikasi Anda perlu mendukung berbagai rilis, gunakan RenderScript untuk perangkat yang menjalankan Android 9 (API level 28) dan yang lebih rendah, serta Vulkan untuk Android 10 (API level 29) dan yang lebih tinggi.

Vulkan tidak menyediakan API Kotlin atau Java, sehingga tidak ada pemetaan langsung dari RenderScript ke Vulkan. Anda harus menulis kode Vulkan menggunakan NDK dan membuat fungsi JNI untuk mengakses kode ini dari Kotlin atau Java.

Bagian berikut ini membahas aspek bermigrasi dari RenderScript. Aplikasi contoh mengimplementasikan hampir semua pertimbangan ini. Untuk lebih memahaminya, bandingkan kode RenderScript dan Vulkan yang setara.

Inisialisasi

Sebagai ganti membuat objek konteks RenderScript di Kotlin atau Java, lakukan langkah-langkah berikut untuk membuat konteks Vulkan dengan NDK.

  1. Buat instance Vulkan.

  2. Pilih perangkat fisik Vulkan yang mendukung antrean komputasi.

  3. Buat perangkat logis Vulkan, dan dapatkan antrean komputasi.

Anda dapat memilih apakah akan menyiapkan lapisan validasi Vulkan di Android untuk mempercepat pengembangan aplikasi Vulkan Anda.

Aplikasi contoh menunjukkan cara melakukan inisialisasi konteks Vulkan di VulkanContext.h. Untuk mempelajari lebih lanjut, lihat bagian Inisialisasi serta Perangkat dan Antrean spesifikasi Vulkan.

Alokasi

Anda dapat memigrasikan Alokasi RenderScript ke gambar penyimpanan Vulkan atau buffer penyimpanan Vulkan. Untuk performa yang lebih baik dengan gambar hanya baca, gunakan gambar contoh dengan operasi pengambilan, baik sebagai kombinasi sampler gambar, maupun dengan binding sampler dan gambar contoh yang berbeda.

Resource Vulkan dialokasikan di dalam Vulkan. Untuk menghindari penyalinan memori secara berlebihan saat berinteraksi dengan komponen Android lainnya, sebaiknya gunakan ekstensi VK_ANDROID_external_memory_android_hardware_buffer untuk mengimpor AHardwareBuffer Android ke Vulkan. Ekstensi ini tersedia di semua perangkat Android yang mendukung Vulkan 1.1. Untuk informasi selengkapnya, lihat FEATURE_VULKAN_HARDWARE_VERSION.

Aplikasi contoh menunjukkan cara membuat resource Vulkan di VulkanResources.h. Untuk mempelajari lebih lanjut, lihat bagian pembuatan resource dan deskripsi resource spesifikasi Vulkan.

Skrip

Skrip RenderScript Anda harus dikonversi ke shader komputasi Vulkan. Anda mungkin juga perlu menyesuaikan kode Anda, bergantung pada penggunaan global RenderScript.

Menulis shader komputasi Vulkan

Shader komputasi Vulkan biasanya ditulis dalam OpenGL Shading Language (GLSL) lalu dikompilasi ke format Standard Portable Intermediate Representation-V (SPIR-V).

Untuk informasi dan petunjuk mendetail tentang cara mengintegrasikan shaders ke dalam aplikasi Anda, lihat compiler shader Vulkan di Android.

Adaptasi global skrip

Berdasarkan karakteristik global skrip, sebaiknya gunakan konstanta spesialisasi, konstanta push, atau objek buffer yang seragam untuk global yang tidak dimodifikasi di dalam shader:

  • Konstanta spesialisasi: Direkomendasikan untuk global skrip yang sebagian besar konsisten di seluruh panggilan kernel. Pengubahan nilai konstanta spesialisasi memerlukan pembuatan ulang pipeline komputasi.
  • Konstanta push: Direkomendasikan untuk global skrip yang sering berubah dan berukuran lebih kecil dari maxPushConstantsSize (ukuran minimum yang dijamin: 128 byte).
  • Buffer yang seragam: Direkomendasikan untuk global skrip yang sering berubah dan lebih besar dari batas konstanta push.

Untuk global yang diubah di dalam shader, Anda dapat menggunakan gambar penyimpanan Vulkan atau buffer penyimpanan Vulkan.

Komputasi

Anda harus membuat pipeline komputasi Vulkan agar GPU menjalankan shader komputasi Anda.

Membuat pipeline komputasi Vulkan

File ComputePipeline.h di aplikasi sampel menunjukkan cara membuat pipeline komputasi Vulkan.

Untuk menggunakan shader SPIR-V yang telah dikompilasi di Vulkan, buat pipeline komputasi Vulkan seperti berikut:

  1. Buat modul shader dengan shader SPIR-V yang telah dikompilasi.
  2. Buat tata letak kumpulan deskripsi yang menentukan binding resource (lihat Alokasi untuk detail selengkapnya).
  3. Buat kumpulan deskripsi dari tata letak kumpulan deskripsi.
  4. Buat tata letak pipeline dari tata letak kumpulan deskripsi.
  5. Buat pipeline komputasi dengan modul shader dan tata letak pipeline.

Untuk informasi selengkapnya, lihat bagian Pipeline Komputasi di spesifikasi Vulkan.

Memulai komputasi

Untuk memulai komputasi dengan pipeline komputasi:

  1. Perbarui kumpulan deskripsi dengan resource Vulkan.
  2. Buat buffer perintah Vulkan, dan catat perintah berikut:
    1. Terapkan binding pada pipeline dan kumpulan deskripsi.
    2. Kirimkan grup kerja komputasi.
  3. Kirimkan buffer perintah ke antrean komputasi.
  4. Tunggu antrean, atau jika ingin, tampilkan fence sinkronisasi.

Untuk mengikat beberapa kernel (misalnya, untuk memigrasikan kode menggunakan ScriptGroup), catat kernel di satu buffer perintah dan sinkronkan dengan memory barrier.

Aplikasi contoh menunjukkan dua tugas komputasi:

  • Rotasi HUE: Tugas komputasi sederhana dengan satu shader komputasi. Lihat ImageProcessor::rotateHue untuk contoh kode.
  • Pemburaman: Tugas komputasi yang lebih kompleks yang secara berurutan menjalankan dua shader komputasi. Lihat ImageProcessor::blur untuk contoh kode.

Untuk mempelajari buffer perintah atau memory barrier lebih lanjut, lihat bagian Buffer Perintah dan Memory Barrier di spesifikasi Vulkan.