RenderScript API'leri, Android 12'den itibaren kullanımdan kaldırılacaktır. Cihaz ve bileşen üreticiler, donanım hızlandırma desteğini ve RenderScript desteğinin gelecekteki bir sürümde tamamen kaldırılması beklenmektedir.
C/C++ performansı birçok kullanım durumu için yeterli olabilir. Yalnızca InderScript'e bağımlıysanız, bu kullanımları RenderScript Intrinsics Değişim Araç Seti'ni kullanabilirsiniz. 2 kat daha fazla performans artışı sağlayabilir.
GPU hızlandırmasından tam olarak yararlanmanız gerekiyorsa komut dosyalarınızı Vulkan'a taşıma, Diğer hızlandırılmış seçenekler komut dosyalarınızı OpenGL'ye, Canvas tabanlı resim işlemleri yapma veya Android Grafik Gölgelendirmesi'nden yararlanma Dil (AGSL)
Android platformunda RenderScript'in kullanımdan kaldırılmasının ardından, RenderScript, Android Gradle eklentisinde kaldırılıyor. Başlangıç Android Gradle eklentisi 7.2, RenderScript API'leri kullanımdan kaldırıldı. Onlar çalışmaya devam eder ancak uyarılar çağırır. AGP'nin gelecekteki sürümleri kullanımdan kaldırılacak Renderscript desteğini içerir. Bu kılavuzda, RenderScript.
Yerleşik öğelerden taşı
RenderScript dahili işlevleri çok fazla işlem varsa, RenderScript'in kullanımdan kaldırılmasıyla GPU'ya dokunun.
Bu işlemlerin bazıları için artık Google Analytics 4'te yerleşik olarak bulunan kolayca erişilebilir hale getirebilirsiniz.
Yerleşik hızlandırılmış görüntü işlemleri
Android platformu, hızlandırılmış görüntü işleme işlemlerini, RenderScript yerleşik özelliklerinden bağımsız olarak resimlere uygulanır. Örnekler:
- Karışık
- Bulanıklaştır
- Renk Matrisi
- Yeniden boyutlandır
Android 12 ve sonraki sürümlerde bir görüntünün bulanıklaştırılması
Android 12'ye bulanıklaştırma desteği sunan RenderEffect
eklendi.
API düzeyi 31, bir RenderNode
öğesini bulanıklaştırmanıza olanak tanır. RenderNode
.
Android'in kampanya performansını hızlandırmak için kullandığı görüntüleme listesi yapısıdır.
platform grafikleridir.
Android, ilişkilendirilmiş RenderNode
öğeye efekt uygulamak için kısayol sağlar
View
ile. View
öğesini bulanıklaştırmak için şu numarayı arayın:
View.setRenderEffect()
:
val blurRenderEffect = RenderEffect.createBlurEffect(radius, radius,
Shader.TileMode.MIRROR
)
view.setRenderEffect(blurRenderEffect)
Android 12 ve sonraki sürümlerde bit eşlem haline getirilmiş resim bulanıklığı
Bulanıklaştırılmış görüntünün bir Bitmap
olarak oluşturulması gerekiyorsa çerçeve
HardwareRenderer
ile hızlandırılmış oluşturmayı destekler
HardwareBuffer
ile desteklenir. Aşağıdaki kod,
Bulanıklaştırma için HardwareRenderer
, RenderNode
ve RenderEffect
:
val imageReader = ImageReader.newInstance(
bitmap.width, bitmap.height,
PixelFormat.RGBA_8888, numberOfOutputImages,
HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE or HardwareBuffer.USAGE_GPU_COLOR_OUTPUT
)
val renderNode = RenderNode("BlurEffect")
val hardwareRenderer = HardwareRenderer()
hardwareRenderer.setSurface(imageReader.surface)
hardwareRenderer.setContentRoot(renderNode)
renderNode.setPosition(0, 0, imageReader.width, imageReader.height)
val blurRenderEffect = RenderEffect.createBlurEffect(
radius, radius,
Shader.TileMode.MIRROR
)
renderNode.setRenderEffect(blurRenderEffect)
Efektin uygulanması için dahili
RenderNode
için RecordingCanvas
. Aşağıdaki kod
çizimi kaydeder, oluşturma isteğini oluşturur ve ardından
bitirme isteği:
val renderCanvas = it.renderNode.beginRecording()
renderCanvas.drawBitmap(it.bitmap, 0f, 0f, null)
renderNode.endRecording()
hardwareRenderer.createRenderRequest()
.setWaitForPresent(true)
.syncAndDraw()
Oluşturulan resim, şununla ilişkilendirilmiş bir HardwareBuffer
içindedir:
ImageReader
. Aşağıdaki kod Image
ve
HardwareBuffer
öğesini sarmalayan bir Bitmap
döndürür.
val image = imageReader.acquireNextImage() ?: throw RuntimeException("No Image")
val hardwareBuffer = image.hardwareBuffer ?: throw RuntimeException("No HardwareBuffer")
val bitmap = Bitmap.wrapHardwareBuffer(hardwareBuffer, null)
?: throw RuntimeException("Create Bitmap Failed")
Aşağıdaki kod, resim oluşturulduktan sonra temizlenir. Lütfen
ImageReader
, RenderNode
, RenderEffect
ve HardwareRenderer
kullanılabilir
resim işleyeceğim.
hardwareBuffer.close()
image.close()
imageReader.close()
renderNode.discardDisplayList()
hardwareRenderer.destroy()
Resim işleme için AGSL
Android Grafik Gölgelendirme Dili (AGSL), Android 13 ve sonraki sürümlerde
programlanabilir öğenin davranışını tanımlama
RuntimeShader
nesne. AGSL
söz diziminin büyük bir kısmını GLSL parça gölgelendiricileriyle paylaşır, ancak
Canvas
içinde boyayı özelleştirmek için kullanılan Android grafik oluşturma sistemi
ve View
içeriğini filtreleyin. Bu, özel resim işleme eklemek için kullanılabilir
oluşturmak için doğrudan RenderNode
kullanarak veya
resmi Bitmap
zemine dönüştürüyor. Aşağıdaki örnekte, bir
özel gölgelendiriciyi kullanın.
AGSL gölgelendiriciyle RuntimeShader
oluşturup örneklendirerek başlayın
girin. Bu gölgelendirici, ton rotasyonu için bir renk matrisi uygulamak için kullanılır:
val hueShader = RuntimeShader("""
uniform float2 iResolution; // Viewport resolution (pixels)
uniform float2 iImageResolution; // iImage1 resolution (pixels)
uniform float iRadian; // radian to rotate things around
uniform shader iImage1; // An input image
half4 main(float2 fragCoord) {
float cosR = cos(iRadian);
float sinR = sin(iRadian);
mat4 hueRotation =
mat4 (
0.299 + 0.701 * cosR + 0.168 * sinR, //0
0.587 - 0.587 * cosR + 0.330 * sinR, //1
0.114 - 0.114 * cosR - 0.497 * sinR, //2
0.0, //3
0.299 - 0.299 * cosR - 0.328 * sinR, //4
0.587 + 0.413 * cosR + 0.035 * sinR, //5
0.114 - 0.114 * cosR + 0.292 * sinR, //6
0.0, //7
0.299 - 0.300 * cosR + 1.25 * sinR, //8
0.587 - 0.588 * cosR - 1.05 * sinR, //9
0.114 + 0.886 * cosR - 0.203 * sinR, //10
0.0, //11
0.0, 0.0, 0.0, 1.0 ); //12,13,14,15
float2 scale = iImageResolution.xy / iResolution.xy;
return iImage1.eval(fragCoord * scale)*hueRotation;
}
""")
Gölgelendirici, diğer herhangi bir RenderEffect
öğesi gibi bir RenderNode
öğesine uygulanabilir.
Aşağıdaki örnekte, hueShader'da üniformaların nasıl ayarlanacağı gösterilmektedir:
hueShader.setFloatUniform("iImageResolution", bitmap.width.toFloat(),
bitmap.height.toFloat())
hueShader.setFloatUniform("iResolution", bitmap.width.toFloat(),
bitmap.height.toFloat())
hueShader.setFloatUniform("iRadian", radian)
hueShader.setInputShader( "iImage1", BitmapShader(bitmap, Shader.TileMode.MIRROR,
Shader.TileMode.MIRROR))
val colorFilterEffect = RenderEffect.createShaderEffect(it.hueShader)
renderNode.setRenderEffect(colorFilterEffect)
Bitmap
efektini elde etmek için önceki görüntü bulanıklaştırmadakiyle aynı teknik kullanılır
örneklem.
- Dahili
RenderNode
içinRecordingCanvas
gölgelendiriciyi uygular. Image
satın alındı ve kendi deneyimini tamamlayan birBitmap
döndürüyorHardwareBuffer
.
CameraX kullanarak düzlemsel YUV'den RGB'ye dönüştürme
Düzlemsel YUV biçiminden dönüştürülüyor için desteklenmektedir. Jetpack'in içindeki ImageAnalysis kullanım alanı KameraX'e dokunun.
ImageAnalysis
ürününün bir parçası olarak kullanımıyla ilgili kaynaklar mevcuttur
KameraX'i Kullanmaya Başlama codelab'i
Android kamerası
örnek deposu.
Renderscript Intrinsics değiştirme araç seti
Uygulamanız yerleşik özellikleri kullanıyorsa bağımsız değişim aracını kullanabilirsiniz kitaplık; testlerimiz mevcut RenderScript CPU'yu kullanmaktan daha hızlı olduğunu gösteriyor. hakkında bilgi edindiniz.
Araç seti aşağıdaki işlevleri içerir:
- Karışık
- Bulanıklaştır
- Renk matrisi
- Konvolüle
- Histogram ve histogramDot
- Arama tablosu (LUT) ve LUT 3D
- Yeniden boyutlandır
- YUV'den RGB'ye
Tüm ayrıntılar ve sınırlamalar için araç setinin README.md
ve Toolkit.kt
sayfalarına göz atın.
dosyası olarak da kaydedebilir.
Kitaplığı indirmek, eklemek ve kullanmak için aşağıdaki adımları uygulayın:
Projeyi indirin oluşturabilirsiniz.
renderscript-toolkit module
öğesini bulun ve oluşturun.Uygulamanın
build.gradle
dosyası yükleyin.Araç setindeki uygun yöntemi çağırın.
Örnek: ScriptIntrinsicBlur işlevinden geçiş yapma
ScriptIntrinsicBlur
işlevini değiştirmek için:
Bit eşlemi bulanıklaştırmak için
Toolkit.blur
numaralı telefonu arayın.var blurredBitmap = Toolkit.blur(myBitmap, radius)
Bayt dizisiyle temsil edilen bir resmi bulanıklaştırmak istiyorsanız ve piksel başına bayt sayısı.
val outArray = Toolkit.blur(inputArray, bytesPerPixel, width, height, radius)
Komut dosyalarından taşı
Kullanım alanınız şunlarla çözülemiyorsa:
- RenderScript Intrinsics Değişim Araç Seti
- Android platformundaki
RenderEffect
veAGSL
gibi yeni API'ler CameraX
gibi Android Jetpack kitaplık API'leri
Kullanım alanınız GPU hızlandırmadan yararlanabilir. Android, GPU'yu destekler Platformlar arası Vulkan ve OpenGL ES (GLES) API'lerinde işlem yapma. Şunları bulabilirsiniz: çünkü çoğu cihazda komut dosyalarınız zaten CPU üzerinde yerine GPU yerine: C/C++ RenderScript, GLES veya Vulkan'dan daha hızlı olabilir bilgi işleme alışkanlığı edinin. (veya en azından kullanım alanınıza yetecek kadar hızlı)
Taşıma işleminin nasıl yapıldığını daha iyi anlamak için örnek uygulama. İlgili içeriği oluşturmak için kullanılan Örnek, hem bit eşlemin nasıl bulanıklaştırılacağını hem de renk matrisi dönüştürmesinin nasıl yapıldığını gösterir ve Vulkan ile OpenGL'de eşdeğer koda sahip.
Uygulamanızın bir dizi sürümü desteklemesi gerekiyorsa RenderScript'i kullanarak
Android 6 (API düzeyi 23) ve önceki sürümleri çalıştıran cihazlar ve Vulkan veya GLES kullanan cihazlar
Android 7 (API düzeyi 24) ve sonraki sürümleri çalıştıran desteklenen cihazlar. Eğer
minSdkVersion
24 veya daha büyükse RenderScript'i kullanmanız gerekmeyebilir; Vulkan veya
GLES 3.1, GPU bilgi işlem desteğine ihtiyacınız olan her yerde kullanılabilir.
Android, GLES API'leri için SDK bağlamaları sunduğundan NDK'yı kullanabilirsiniz.
Vulkan, SDK bağlamalarını sağlamadığından RenderScript'i Vulkan'a; NDK'yı kullanarak Vulkan kodunu yazıyorsunuz ve JNI işlevlerini kullanarak bu koda Kotlin veya Java'dan erişebilirsiniz.
Aşağıdaki sayfalarda RenderScript'ten taşıma ile ilgili özellikler ele alınmaktadır. Örnek uygulamasında bu hususların neredeyse tamamını gerçekleştirmektedir. Projeleri daha iyi anlamak için ve RenderScript ve Vulkan eşdeğeri kodlarını karşılaştırın.