نقل البيانات من RenderScript

سيتم إيقاف واجهات برمجة تطبيقات RenderScript نهائيًا بدءًا من نظام التشغيل Android 12. الجهاز والمكوِّن الشركة المصنعة بالفعل عن تقديم دعم تسريع الأجهزة، ومن المتوقّع أن تتم إزالة إمكانية استخدام RenderScript بالكامل في إصدار مستقبلي.

قد يكون أداء لغة C/C++ مناسبًا للعديد من حالات الاستخدام، وإذا كنت تعتمد على RenderScript باعتبارها عناصر أساسية، يمكنك استبدال هذه الاستخدامات مجموعة أدوات الاستبدال في RenderScript Intrinsics للاستخدام ويأتي مع تحسين الأداء بمقدار الضعف!

إذا كنت تريد الاستفادة بشكل كامل من تسريع وحدة معالجة الرسومات، ننصحك نقل النصوص البرمجية إلى Vulkan، وخيارات مسرَّعة أخرى على نقل النصوص البرمجية إلى OpenGL باستخدام المستند إلى لوحة الرسم عمليات الصور، أو الاستفادة من تظليل رسومات Android اللغة (AGSL)

بعد إيقاف RenderScript في نظام Android الأساسي، يتزايد دعم ستتم إزالة RenderScript في المكوّن الإضافي لنظام Gradle المتوافق مع Android. البدء بـ الإصدار 7.2 من المكوّن الإضافي لنظام Gradle المتوافق مع Android، تم إيقاف واجهات برمجة تطبيقات RenderScript نهائيًا. هم الاستمرار في العمل، ولكن مع استدعاء تحذيرات. لن تعد الإصدارات المستقبلية من AGP على دعم Renderscript. يوضح هذا الدليل كيفية نقل البيانات من RenderScript.

نقل البيانات من الأساسيات

على الرغم من أنّ الدوال الأساسية لـ RenderScript لا تزال تعمل بعد إيقاف RenderScript نهائيًا، فقد يتم تنفيذها على وحدة المعالجة المركزية فقط بدلاً من وحدة معالجة رسومات.

بالنسبة لبعض هذه العمليات، يوجد خيارات أكثر كفاءة مدمجة الآن في النظام الأساسي أو في مكتبات Jetpack.

عمليات الصور المسرّعة المدمجة

يدعم نظام Android الأساسي عمليات المعالجة السريعة للصور التي يمكن ستُطبق على الصور، بغض النظر عن عناصر RenderScript. تشمل الأمثلة ما يلي:

  • مزيج
  • تمويه
  • مصفوفة الألوان
  • تغيير الحجم

تمويه الصور على نظام التشغيل Android 12 والإصدارات الأحدث في وضع العرض

تمت إضافة RenderEffect ميزة التمويه إلى Android 12، المستوى 31 من واجهة برمجة التطبيقات، ما يتيح لك تمويه RenderNode. RenderNode هي تركيبة من قائمة العرض التي يستخدمها Android للمساعدة في تسريع ورسومات المنصة.

يوفّر Android اختصارًا لتطبيق تأثير على RenderNode المرتبطة. من خلال View. لتمويه شاشة View، يُرجى إجراء مكالمة. View.setRenderEffect():

val blurRenderEffect = RenderEffect.createBlurEffect(radius, radius,
        Shader.TileMode.MIRROR
    )
view.setRenderEffect(blurRenderEffect)

تمويه الصور على Android 12 والإصدارات الأحدث معروضة في صورة نقطية

إذا أردت عرض الصورة المموّهة في Bitmap، يمكنك استخدام إطار العمل. تتيح استخدام العرض المسرّع باستخدام HardwareRenderer ومدعوم من HardwareBuffer تنشئ التعليمة البرمجية التالية HardwareRenderer وRenderNode و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)

يتضمن تطبيق التأثير استخدام التأثير الداخلي RecordingCanvas لـ RenderNode. يُنشئ الكود التالي يسجّل الرسم، وينشئ طلب العرض، ثم ينتظر طلب إنهاء:

val renderCanvas = it.renderNode.beginRecording()
renderCanvas.drawBitmap(it.bitmap, 0f, 0f, null)
renderNode.endRecording()
hardwareRenderer.createRenderRequest()
    .setWaitForPresent(true)
    .syncAndDraw()

الصورة التي يتم عرضها في HardwareBuffer مرتبط بـ ImageReader يحصل الرمز التالي على Image تعرض القيمة Bitmap التي تلتف حول HardwareBuffer.

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")

يتم تنظيف الرمز البرمجي التالي بعد عرض الصورة. لاحظ أن يمكن استخدام ImageReader وRenderNode وRenderEffect وHardwareRenderer. لمعالجة صور متعددة.

hardwareBuffer.close()
image.close()
imageReader.close()
renderNode.discardDisplayList()
hardwareRenderer.destroy()

AGSL لمعالجة الصور

يستخدم نظام التشغيل Android 13 والإصدارات الأحدث لغة تظليل الرسومات Android (AGSL) للأغراض التالية: تحديد سلوك واجهة برمجة التطبيقات عناصر RuntimeShader لغة AGSL تشارك الكثير من بناء الجملة مع أدوات تظليل أجزاء GLSL، ولكنها تعمل ضمن نظام عرض رسومات Android لتخصيص الرسم ضمن Canvas وفلترة محتوى View ويمكن استخدام هذه البيانات لإضافة معالجة مخصّصة للصور. أثناء عمليات الرسم أو باستخدام RenderNode مباشرةً لعرض صورة في لوحة Bitmap. يوضح المثال التالي كيفية تطبيق أداة تظليل مخصصة لاستبدال تأثير تمويه الصورة.

ابدأ بإنشاء RuntimeShader، وأنشِئ مثيلاً له باستخدام أداة تظليل AGSL. الرمز. تُستخدم أداة التظليل هذه لتطبيق مصفوفة ألوان لتدوير تدرُّج التدرج:

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;
    }
""")

يمكن استخدام أداة التظليل على RenderNode، تمامًا كأي RenderEffect آخر. يوضح المثال التالي كيفية وضع الزي الرسمي في hueShader:

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، يتم استخدام الأسلوب نفسه كما في تمويه الصورة السابق. كعينة.

  • الفريق الداخلي يتم استخدام أداة التظليل RecordingCanvas في RenderNode.
  • تم الحصول على Image، وسيتم عرض Bitmap التي تلتف HardwareBuffer

التحويل من YUV المستقيم إلى نموذج أحمر أخضر أزرق باستخدام CameraX

التحويل من YUV المستوي إلى النموذج اللوني أحمر أخضر أزرق للاستخدام في معالجة الصور كجزء من حالة الاستخدام ImageAnalysis ضمن Jetpack CameraX.

تتوفّر موارد حول استخدام ImageAnalysis كجزء من بدء استخدام التمرين المعملي حول الترميز في CameraX وفي كاميرا Android مستودع النماذج.

مجموعة أدوات الاستبدال الخاصة بالعناصر الأساسية في Renderscript

إذا كان تطبيقك يستخدم سمات أساسية، يمكنك استخدام البديل المستقل المكتبة؛ تشير اختباراتنا إلى أنّه أسرع من استخدام وحدة المعالجة المركزية الحالية RenderScript التنفيذ.

تتضمن مجموعة الأدوات الوظائف التالية:

  • مزيج
  • تمويه
  • مصفوفة الألوان
  • تدوير
  • المدرّج التكراري والرمز التكراري
  • جدول البحث (LUT) وLUT 3D
  • تغيير الحجم
  • YUV إلى نموذج أحمر أخضر أزرق

للاطّلاع على التفاصيل الكاملة والقيود المفروضة، يمكنك الاطّلاع على README.md وToolkit.kt لمجموعة الأدوات. .

نفِّذ الخطوات التالية لتنزيل المكتبة وإضافتها واستخدامها:

  1. تنزيل المشروع من GitHub.

  2. حدِّد موقع "renderscript-toolkit module" وأنشئه.

  3. يمكنك إضافة المكتبة إلى مشروع "استوديو Android" من خلال تعديل ملف build.gradle.

  4. استدعِ الطريقة المناسبة لمجموعة الأدوات.

مثال: النقل من الدالة ScriptIntrinsicBure

لاستبدال الدالة ScriptIntrinsicBlur:

  • لتمويه صورة نقطية، يُرجى الاتصال بالرقم Toolkit.blur.

    var blurredBitmap = Toolkit.blur(myBitmap, radius)
    
  • إذا كنت تريد تعتيم صورة ممثلة بمصفوفة من وحدات البايت، حدد والعرض والارتفاع وعدد وحدات البايت لكل بكسل.

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

نقل البيانات من النصوص البرمجية

إذا تعذّر حلّ حالة الاستخدام من خلال:

ويمكن أن تستفيد حالة الاستخدام من تسريع وحدة معالجة الرسومات، إذ يتوافق Android مع وحدة معالجة الرسومات على واجهات برمجة تطبيقات Vulkan وOpenGL ES (GLES) عبر الأنظمة الأساسية. قد تجد هذا غير ضروري لأن النصوص البرمجية تعمل على وحدة المعالجة المركزية في معظم الأجهزة بدلاً من وحدة معالجة الرسومات: قد يكون C/C++ أسرع من RenderScript أو GLES أو Vulkan. والحوسبة لبعض حالات الاستخدام. (أو على الأقل سريعة بما يكفي لحالة الاستخدام)

للتعرّف بشكل أفضل على كيفية نقل البيانات، راجِع نموذج تطبيق. تشير رسالة الأشكال البيانية نموذج يوضح كيفية تمويه صورة نقطية وإجراء تحويل بمصفوفة الألوان في RenderScript، ولها رمز مكافئ في Vulkan وOpenGL.

إذا كان تطبيقك يحتاج إلى أن يتوافق مع مجموعة من الإصدارات، استخدِم RenderScript من أجل أجهزة تعمل بنظام التشغيل Android 6 (المستوى 23 لواجهة برمجة التطبيقات) والإصدارات الأقدم، وVulkan أو GLES على الأجهزة المتوافقة التي تعمل بنظام التشغيل Android 7 (المستوى 24 لواجهة برمجة التطبيقات) والإصدارات الأحدث. إذا كان يبلغ العمر minSdkVersion 24 عامًا أو أكثر، وقد لا تحتاج إلى استخدام RenderScript. Vulkan أو يمكن استخدام GLES 3.1 في أيّ مكان تحتاج فيه إلى التوافق مع وحدة معالجة الرسومات.

يوفر Android عمليات ربط SDK لواجهات برمجة تطبيقات GLES، لذا ليس من الضروري استخدام NDK عند العمل في OpenGL ES.

لا توفر Vulkan عمليات ربط SDK، لذلك لا يوجد تعيين مباشر من RenderScript إلى Vulkan تقوم بكتابة كود Vulkan باستخدام NDK وإنشاء JNI للوصول إلى هذه التعليمات البرمجية من Kotlin أو Java.

تتناول الصفحات التالية جوانب نقل البيانات من RenderScript. العيّنة تطبيقك تقريبًا جميع هذه الاعتبارات. لفهمها بشكل أفضل، للمقارنة بين التعليمات البرمجية المكافئة لـ RenderScript وVulkan.