سيتم إيقاف واجهات برمجة تطبيقات 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
لمجموعة الأدوات.
.
نفِّذ الخطوات التالية لتنزيل المكتبة وإضافتها واستخدامها:
تنزيل المشروع من GitHub.
حدِّد موقع "
renderscript-toolkit module
" وأنشئه.يمكنك إضافة المكتبة إلى مشروع "استوديو Android" من خلال تعديل ملف
build.gradle
.استدعِ الطريقة المناسبة لمجموعة الأدوات.
مثال: النقل من الدالة ScriptIntrinsicBure
لاستبدال الدالة ScriptIntrinsicBlur
:
لتمويه صورة نقطية، يُرجى الاتصال بالرقم
Toolkit.blur
.var blurredBitmap = Toolkit.blur(myBitmap, radius)
إذا كنت تريد تعتيم صورة ممثلة بمصفوفة من وحدات البايت، حدد والعرض والارتفاع وعدد وحدات البايت لكل بكسل.
val outArray = Toolkit.blur(inputArray, bytesPerPixel, width, height, radius)
نقل البيانات من النصوص البرمجية
إذا تعذّر حلّ حالة الاستخدام من خلال:
- مجموعة أدوات الاستبدالات الأساسية في RenderScript
- واجهات برمجة التطبيقات الجديدة في نظام Android الأساسي مثل
RenderEffect
وAGSL
- واجهات برمجة التطبيقات لمكتبة Android Jetpack، مثل
CameraX
ويمكن أن تستفيد حالة الاستخدام من تسريع وحدة معالجة الرسومات، إذ يتوافق 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.