RenderScript'ten veri taşıma

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çin RecordingCanvas gölgelendiriciyi uygular.
  • Image satın alındı ve kendi deneyimini tamamlayan bir Bitmap döndürüyor HardwareBuffer.

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:

  1. Projeyi indirin oluşturabilirsiniz.

  2. renderscript-toolkit module öğesini bulun ve oluşturun.

  3. Uygulamanın build.gradle dosyası yükleyin.

  4. 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)
    
ziyaret edin.

Komut dosyalarından taşı

Kullanım alanınız şunlarla çözülemiyorsa:

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.