Начиная с Android 12, API RenderScript устарел.
Google рекомендует использовать более эффективный Vulkan.
Однако в этом документе по-прежнему рассматривается использование RenderScript, что относительно просто.
RenderScript — это платформа для выполнения ресурсоемких задач с высокой производительностью на Android.
RenderScript предназначен для параллельных вычислений, но последовательные рабочие нагрузки также могут принести пользу.
Среда выполнения RenderScript может планировать рабочие нагрузки параллельно на нескольких процессорах, доступных на устройстве, таких как многоядерные процессоры и графические процессоры, что позволяет разработчикам сосредоточиться на выражении алгоритмов, а не на планировании работы. RenderScript особенно полезен для приложений, ориентированных на обработку изображений, вычислительную фотографию или компьютерное зрение.
О RenderScript, официальном вводном документе Google.
https://source.android.google.cn/docs/core/architecture/vndk/renderscript?hl=zh-cn
Пример использования RenderScript:
Следующий пример содержимого предназначен для преобразования yuv420_888 в растровое изображение в реальном времени в обратном вызове imageReader.
mYuvImageReader = ImageReader.newInstance(1920, 1080,
ImageFormat.YUV_420_888, 4);
private final ImageReader.OnImageAvailableListener mOnYuvImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
if (image != null) {
Log.e(TAG,"YUV_420_888_toRGBIntrinsics start");
mBitMap = YUV_420_888_toRGBIntrinsics(image,getActivity());
mHandler.post(new Runnable() {
@Override
public void run() {
showImage(mBitMap);
}
});
Log.e(TAG,"YUV_420_888_toRGBIntrinsics end");
}
}
};
private static RenderScript rs;
private static Bitmap YUV_420_888_toRGBIntrinsics(Image image,Context context) {
if (image == null) return null;
int W = image.getWidth();
int H = image.getHeight();
Image.Plane Y = image.getPlanes()[0];
Image.Plane U = image.getPlanes()[1];
Image.Plane V = image.getPlanes()[2];
int Yb = Y.getBuffer().remaining();
int Ub = U.getBuffer().remaining();
int Vb = V.getBuffer().remaining();
byte[] data = new byte[Yb + Ub + Vb];
Y.getBuffer().get(data, 0, Yb);
V.getBuffer().get(data, Yb, Vb);
U.getBuffer().get(data, Yb + Vb, Ub);
rs = RenderScript.create(context);
ScriptIntrinsicYuvToRGB yuvToRgbIntrinsic = ScriptIntrinsicYuvToRGB.create(rs, Element.U8_4(rs));
Type.Builder yuvType = new Type.Builder(rs, Element.U8(rs)).setX(data.length);
Allocation in = Allocation.createTyped(rs, yuvType.create(), Allocation.USAGE_SCRIPT);
Type.Builder rgbaType = new Type.Builder(rs, Element.RGBA_8888(rs)).setX(W).setY(H);
Allocation out = Allocation.createTyped(rs, rgbaType.create(), Allocation.USAGE_SCRIPT);
final Bitmap bmpout = Bitmap.createBitmap(W, H, Bitmap.Config.ARGB_8888);
in.copyFromUnchecked(data);
yuvToRgbIntrinsic.setInput(in);
yuvToRgbIntrinsic.forEach(out);
out.copyTo(bmpout);
image.close();
return bmpout ;
}
Печать лога: Как видно из лога ниже, при разрешении 1920*1080 конвертация занимает около 30 мс.
2023-12-25 14:06:27.294 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics end
2023-12-25 14:06:27.311 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics start
2023-12-25 14:06:27.352 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics end
2023-12-25 14:06:27.353 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics start
2023-12-25 14:06:27.371 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics end
2023-12-25 14:06:27.398 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics start
2023-12-25 14:06:27.415 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics end
2023-12-25 14:06:27.435 15912-22157 Camera2BasicFragment com.android.camera2demo E YUV_420_888_toRGBIntrinsics start
Расширения:
1、Vulkan
Vulkan использует вычислительный шейдер на Android
https://zhuanlan.zhihu.com/p/258130830 https://blog.51cto.com/u_16099335/6861390
2、libyuv
https://github.com/GitLqr/LQRLibyuv