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
RenderNodeiçinRecordingCanvasgölgelendiriciyi uygular. Imagesatın alındı ve kendi deneyimini tamamlayan birBitmapdö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.gradledosyası 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.blurnumaralı 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
RenderEffectveAGSLgibi yeni API'ler CameraXgibi 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.