RenderScript API tidak digunakan lagi mulai Android 12. API ini akan terus berfungsi untuk sementara waktu, tetapi produsen perangkat dan komponen telah berhenti menyediakan dukungan akselerasi hardware, dan dukungan RenderScript akan dihapus sepenuhnya dalam rilis mendatang.
Banyak pengguna akan melihat performa C/C++ yang memadai untuk penggunaannya, dan jika Anda hanya mengandalkan RenderScript untuk intrinsik, Anda dapat mengganti penggunaan tersebut dengan Toolkit Penggantian Intrinsik RenderScript, yang lebih mudah digunakan dan berpotensi meningkatkan performa 2x lipat.
Jika Anda benar-benar perlu memanfaatkan akselerasi GPU secara optimal, sebaiknya migrasikan skrip Anda ke Vulkan.
Setelah RenderScript tidak digunakan lagi di platform Android, kami juga menghapus dukungan untuk RenderScript di plugin Android Gradle. Mulai plugin Android Gradle 7.2, RenderScript API tidak digunakan lagi. API akan terus berfungsi, tetapi akan memanggil peringatan, dan akan dihapus sepenuhnya di versi AGP mendatang. Panduan ini menjelaskan cara melakukan migrasi dari RenderScript.
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:
Download project dari GitHub.
Temukan dan buat
renderscript-toolkit module
.Tambahkan library ke project Android Studio dengan memodifikasi file
build.gradle
aplikasi.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
Jika kasus penggunaan Anda tidak dapat diselesaikan denganPenggantian Intrinsik RenderScript Toolkit (yang menawarkan peningkatan performa 2x lipat dibandingkan RenderScript), sebaiknya migrasikan skrip RenderScript ke Vulkan API lintas platform. Hal ini mungkin tidak diperlukan karena di sebagian besar perangkat, skrip sudah berjalan di CPU, bukan GPU: C/C++ mungkin lebih cepat daripada komputasi Vulkan atau RenderScript untuk beberapa kasus penggunaan, dan mungkin cukup cepat meskipun jika Vulkan atau RenderScript dapat berfungsi lebih baik.
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 6 (API level 23) dan yang lebih rendah, serta Vulkan untuk Android 7
(API level 24) dan yang lebih tinggi. Jika minSdkVersion
adalah 24 atau lebih tinggi, Anda tidak
perlu menggunakan RenderScript; Vulkan dapat digunakan di setiap perangkat yang Anda dukung.
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.
Buat instance Vulkan.
Pilih perangkat fisik Vulkan yang mendukung antrean komputasi.
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:
- Buat modul shader dengan shader SPIR-V yang telah dikompilasi.
- Buat tata letak kumpulan deskripsi yang menentukan binding resource (lihat Alokasi untuk detail selengkapnya).
- Buat kumpulan deskripsi dari tata letak kumpulan deskripsi.
- Buat tata letak pipeline dari tata letak kumpulan deskripsi.
- 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:
- Perbarui kumpulan deskripsi dengan resource Vulkan.
- Buat buffer perintah Vulkan, dan catat perintah berikut:
- Terapkan binding pada pipeline dan kumpulan deskripsi.
- Kirimkan grup kerja komputasi.
- Kirimkan buffer perintah ke antrean komputasi.
- 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.