当前位置: 首页 > news >正文

Android RenderScript 浅谈

前言

     RenderScript是一个Google出品的,在Android平台上的并行计算框架,官方的简介是说RenderScript运行时可在设备上提供的多个处理器(如多核 CPU 和 GPU)间并行调度工作。在日常Android开发中,RenderScript主要用于图像处理。比如对图片做高斯模糊等,都可以用RenderScript处理。

在这里插入图片描述
内容来自RenderScript 概览

扯淡的文档说明, 加上这玩意要被舍弃了, 觉得有点可惜
在这里插入图片描述
内容来自从 RenderScript 迁移

使用

     总的来说,RenderScript能干的事情很多,但有限。常见用于处理Bitmap的效果、转换。
如(参考RenderScript Intrinsics Replacement Toolkit):

  • blend,
  • blur,
  • color matrix,
  • convolve,
  • histogram and histogramDot,
  • LUT (lookup table) and LUT 3D,
  • resize, and YUV to RGB.

反色参考代码:

uchar4 RS_KERNEL invert(uchar4 in, uint32_t x, uint32_t y) {
  uchar4 out = in;
  out.r = 255 - in.r;
  out.g = 255 - in.g;
  out.b = 255 - in.b;
  return out;
}

对应java调用代码

	public static Bitmap invert(Context context, Bitmap bm){
		Bitmap bmOut = Bitmap.createBitmap(bm);
		RenderScript RS = RenderScript.create(context);
		ScriptC_singlesource script = new ScriptC_singlesource(RS);
		//Allocation inputAllocation = Allocation.createFromBitmapResource(
		//		RS, getResources(), R.drawable.image);
		Allocation inputAllocation = Allocation.createFromBitmap(RS, bm);
		Allocation outputAllocation = Allocation.createFromBitmap(RS, bmOut);
		//Allocation outputAllocation = Allocation.createTyped(
		//		RS, inputAllocation.getType(),
		//		Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT);
		script.forEach_invert(inputAllocation, outputAllocation);
		outputAllocation.copyTo(bmOut);
		RS.destroy();
		return bmOut;
	}

    其他基础用法案例可以参考本文末尾参考部分连接资料,接下来是一些新的尝试。

  1. 前面大部分的接口的入参都是bitmap, 如果要使用int[] 或 **byte[]**呢?
//https://blog.csdn.net/oDongFangZhiZi/article/details/71422510
int __attribute__((kernel)) test0(int in, uint32_t x) {
    int out = in;
    out = x;
    return out;
}
	public static void test0(Context context, int[] src) {

		// 创建 RenderScript 对象
		RenderScript rs = RenderScript.create(context);

		// 创建输入、输出 Allocation
		Allocation allIn  = Allocation.createSized(rs, Element.I32(rs), src.length);
		allIn.copyFrom(src);

		byte[] out = new byte[src.length];
		Allocation allOut  = Allocation.createSized(rs, Element.I32(rs), src.length);

		ScriptC_test rsTest = new ScriptC_test(rs);
		rsTest.forEach_test0(allIn, allOut);
		allOut.copyTo(out);
		// 释放资源
		rs.destroy();
	}

重点在于Allocation.createSized(rs, Element.I32(rs), src.length); 关于Element的文档,真的让人无从下手…
在这里插入图片描述

int[] 相对简单,如果在RS中使用的是uchar4, 入参怎么传? 答案是可以用byte[](非标准答案,仅供参考)

//map for byte[4]
//rgba = [0][1][2][3]
uchar4 __attribute__((kernel)) test1(uchar4 in, uint32_t x, uint32_t y) {
    uchar4 out = in;
    //out.r = x;
    out.g = x + 1;
    out.b = x + 2;
    out.a = x + 3;
    return out;
}
	public static void test(Context context, byte[] src) {
		// 创建 RenderScript 对象
		RenderScript rs = RenderScript.create(context);

		// 创建输入、输出 Allocation
		Allocation allIn  = Allocation.createSized(rs, Element.RGBA_8888(rs), src.length/4);
		allIn.copyFrom(src);

		byte[] out = new byte[src.length];
		Allocation allOut  = Allocation.createSized(rs, Element.RGBA_8888(rs), src.length/4);

		ScriptC_test rsTest = new ScriptC_test(rs);
		rsTest.forEach_test1(allIn, allOut);
		allOut.copyTo(out);
		// 释放资源
		rs.destroy();
	}
test(getContext(), new byte[]{
				10, 0, 0, 0,
				11, 0, 0, 0,
				12, 0, 0, 0,
				13, 0, 0, 0,
				14, 0, 0, 0,
				15, 0, 0, 0,
				16, 0, 0, 0,
				17, 0, 0, 0});
//结果:
//0x0a,0x01,0x02,0x03,
//0x0b,0x02,0x03,0x04,
//0x0c,0x03,0x04,0x05,
//0x0d,0x04,0x05,0x06,
//0x0e,0x05,0x06,0x07,
//0x0f,0x06,0x07,0x08,
//0x10,0x07,0x08,0x09,
//0x11,0x08,0x09,0x0a

RenderScript源码位置

frameworks/base/rs/
├── java
│ └── android
│ └── renderscript
│ ├── AllocationAdapter.java
│ ├── Allocation.java
│ ├── BaseObj.java
│ ├── Byte2.java
│ ├── Byte3.java
│ ├── Byte4.java
│ ├── Double2.java
│ ├── Double3.java
│ ├── Double4.java
│ ├── Element.java
│ ├── FieldPacker.java
│ ├── FileA3D.java
│ ├── Float2.java
│ ├── Float3.java
│ ├── Float4.java
│ ├── Font.java
│ ├── Int2.java
│ ├── Int3.java
│ ├── Int4.java
│ ├── Long2.java
│ ├── Long3.java
│ ├── Long4.java
│ ├── Matrix2f.java
│ ├── Matrix3f.java
│ ├── Matrix4f.java
│ ├── Mesh.java
│ ├── package.html
│ ├── ProgramFragmentFixedFunction.java
│ ├── ProgramFragment.java
│ ├── Program.java
│ ├── ProgramRaster.java
│ ├── ProgramStore.java
│ ├── ProgramVertexFixedFunction.java
│ ├── ProgramVertex.java
│ ├── RenderScriptCacheDir.java
│ ├── RenderScriptGL.java
│ ├── RenderScript.java
│ ├── RSDriverException.java
│ ├── RSIllegalArgumentException.java
│ ├── RSInvalidStateException.java
│ ├── RSRuntimeException.java
│ ├── RSSurfaceView.java
│ ├── RSTextureView.java
│ ├── Sampler.java
│ ├── ScriptC.java
│ ├── ScriptGroup.java
│ ├── ScriptIntrinsic3DLUT.java
│ ├── ScriptIntrinsicBLAS.java
│ ├── ScriptIntrinsicBlend.java
│ ├── ScriptIntrinsicBlur.java
│ ├── ScriptIntrinsicColorMatrix.java
│ ├── ScriptIntrinsicConvolve3x3.java
│ ├── ScriptIntrinsicConvolve5x5.java
│ ├── ScriptIntrinsicHistogram.java
│ ├── ScriptIntrinsic.java
│ ├── ScriptIntrinsicLUT.java
│ ├── ScriptIntrinsicResize.java
│ ├── ScriptIntrinsicYuvToRGB.java
│ ├── Script.java
│ ├── Short2.java
│ ├── Short3.java
│ ├── Short4.java
│ └── Type.java
├── jni
│ ├── Android.mk
│ └── android_renderscript_RenderScript.cpp
└── OWNERS

frameworks/rs

参考

RenderScript使用教程(一)
RenderScript :简单而快速的图像处理
RenderScript简单使用
Android 如何使用 RenderScript ?
BlurTestAndroid/BlurBenchmark/src/main/rs/contrast.rs

相关文章:

  • SpringBoot+vue的图书管理系统
  • Java SE 基础(3) Java语言概述
  • Spring框架说明
  • 【区块链技术开发】 Solidity使用Truffle Box工具实现预构建模板、自动化部署、创建智能合约示例代码
  • 大事务问题解决方案
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • Typora使用
  • ChatGPT自我分析
  • ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题
  • 固态硬盘需要分区吗 固态硬盘怎么分区
  • Linux:进程信号
  • 解决访问客户端位nat模式服务端syn握手失败的问题
  • 【Python】线程
  • 【markdown】markdown语法进阶
  • 自动驾驶自主避障概况
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Django 博客开发教程 16 - 统计文章阅读量
  • download使用浅析
  • JavaWeb(学习笔记二)
  • Java到底能干嘛?
  • React as a UI Runtime(五、列表)
  • SegmentFault 2015 Top Rank
  • Sublime Text 2/3 绑定Eclipse快捷键
  • VUE es6技巧写法(持续更新中~~~)
  • 驱动程序原理
  • 微信开放平台全网发布【失败】的几点排查方法
  • 正则学习笔记
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​Java并发新构件之Exchanger
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • (11)MSP430F5529 定时器B
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (八十八)VFL语言初步 - 实现布局
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (六)c52学习之旅-独立按键
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)插入排序
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)大道至简,职场上做人做事做管理
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .Net 垃圾回收机制原理(二)
  • .NET 中 GetProcess 相关方法的性能
  • .NET实现之(自动更新)
  • /*在DataTable中更新、删除数据*/
  • @Builder用法
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 蓝桥杯Web真题 ]-布局切换
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [AIGC codze] Kafka 的 rebalance 机制
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存