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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/7428.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库:Redis哨兵及cluster集群部署

一、redis数据库哨兵模式 目录 一、redis数据库哨兵模式 1、什么是哨兵模式 2、哨兵的作用 3、哨兵结构组成 4、哨兵故障转移机制 5、哨兵工作、切换原理 6、哨兵主节点选举原则 7、哨兵模式部署 二、redis数据库cluster集群 1、cluster集群优点、数据存储及同步方式…

Chapter2 : SpringBoot配置

尚硅谷SpringBoot顶尖教程 1. 全局配置文件 SpringBoot使用一个全局的配置文件 application.properties 或者 application.yml ,该配置文件放在src/main/resources目录或者类路径/config目录下面, 可以用来修改SpringBoot自动配置的默认值。 yml是YA…

wxml模板,wxss模版,全局配置,页面配置,网络数据请求

WXML 模板语法 1、数据绑定 1.1、数据绑定的基本原则 ① 在 data 中定义数据② 在 WXML 中使用数据 1.2、在 data 中定义页面的数据 在页面对应的 .js 文件中,把数据定义到 data 对象中即可: Page({data: {//字符串数据info:init data}, });1.3、M…

《Kubernetes部署篇:Ubuntu20.04基于containerd部署kubernetes1.24.12单master集群》

一、架构图 如下图所示: 二、环境信息 主机名K8S版本系统版本内核版本IP地址备注k8s-master-621.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.62master节点k8s-worker-631.24.12Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63worker节点k8s-worker-641…

二、SDN-计算机网络专项(2)

1、编码 编码形式: 以太网使用的编码方式为曼彻斯特编码。 2、信息传输速率 (1)香农定理 带宽为W(Hz)且有高斯噪音干扰(信噪比S/N)的信道极限信息传输速率为: 还有,信噪…

Linux_红帽8学习笔记分享_2

Linux_红帽8学习笔记分享_2 文章目录Linux_红帽8学习笔记分享_21.远程控制servera和serverb1.1开启多标签页1.2启用servera和serverb1.3连接servera和serverb2.退出子虚拟机并关机2.1退出子虚拟机2.2关闭虚拟机2.3重启虚拟机3.Linux在使用过程中遇到的基础操作3.1退出至登录界面…

Spring销毁的几种实现

有这3种方法,但是程序执行完成并没有打印出来。一定要手动close.手动执行后会调用如下逻辑:org.springframework.context.support.AbstractApplicationContext#doCloseorg.springframework.context.support.AbstractApplicationContext#destroyBeansorg.…

点亮孙武不夜城 拉响惠民经济新引擎

凡战者,以奇制胜。这次的招商很特别—孙武不夜城招商项目正式启动!      无租金、无投资、无风险合伙人制。      现诚邀广大商家合作,相聚不夜城。同此道者,合大志,鸣鼓纳征,亮惠民夜生活&#xf…

一位年薪35W的测试被开除,回怼的一番话,令人沉思

一位年薪35W测试工程师被开除回怼道:“反正我有技术,在哪不一样” 一技傍身,万事不愁,当我们掌握了一技之长后,在职场上说话就硬气了许多,不用担心被炒,反过来还可以炒了老板,这一点…

如何防御恶意流量攻击(CC、DDoS)?

随之网络安全的地位不断提高,越来越多的攻击得以解决,但随之而来的也是新的攻击在变着花样地出现,就好比DDoS攻击与CC攻击就是这些年较为常见的攻击手段,这两种攻击分别针对网站的应用层和网络层。 我们网站运维人员一定要做好功课…

Vue--构建亚马逊多账号的后台数据展示

效果展示&#xff1a; 根据自创的账号个数来创建对应的表格个数 移动到对应商品时展示该商品的日出售变化情况 设计思路&#xff1a; 获取亚马逊平台个人账号数据传入自定义组件<WeekTable> <WeekTable>组件获取到数据后&#xff0c;就会重载DOM元素内容。我们在组…

Ae 入门系列之七:文本动画

Ae 提供了多种制作文本动画的方法。既可以在时间轴面板上基于基本属性手动添加关键帧&#xff0c;还可以使用专门的文本动画制作工具&#xff0c;或者直接使用动画预设。有关文本图层的基础知识请参阅&#xff1a;《Ae&#xff1a;文本图层操作基础》提示&#xff1a;文本动画的…

员工培训Employee Training

前言 加油 原文 员工培训常用会话 ❶ When is our training session? 我们的课程培训在什么时候? ❷ You shouldn’t be absent at training sessions. 你不能缺席课程培训。 ❸ You should follow these rules and regulations. 你应该遵守这些规章制度。 ❺ The staff…

ROS实践11 自定义头文件并调用

文章目录运行环境&#xff1a;思路&#xff1a;1.1 编写头文件1.2 includepath添加头文件路径1.3 编写可执行文件1.4 配置文件1.5 编译运行运行环境&#xff1a; ubuntu20.04 noetic 宏基暗影骑士笔记本 思路&#xff1a; 类和函数&#xff1a; 头文件 声明 可执行文件 定义…

测试行业3年经验,从大厂裸辞后,面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生

测试员可以先在大厂镀金&#xff0c;以后去中小厂毫无压力&#xff0c;基本不会被卡&#xff0c;事实果真如此吗&#xff1f;但是在我身上却是给了我很大一巴掌... 所谓大厂镀金只是不卡简历而已&#xff0c;如果面试答得稀烂&#xff0c;人家根本不会要你。况且要不是大厂出来…

Leetcode6365. 最少翻转操作数题解

题目在此&#xff1a;力扣 首先&#xff0c;先祝福自己本周周赛过了三题。耶耶耶耶耶耶&#xff01;虽然第一题因为脑子不好使想了半天&#xff0c;还WA了一次。衷心祈祷今年力扣能上1800分&#xff01;&#xff01;&#xff01; 这道题&#xff0c;我看了一些通过人数&#x…

【面试】Java高频面试题(2023最新整理)

文章目录一、java基础1、JDK 和 JRE 有什么区别&#xff1f;2、 和 equals 的区别是什么&#xff1f;3、final 在 java 中有什么作用&#xff1f;4、java 中的 Math.round(-1.5) 等于多少&#xff1f;5、String 属于基础的数据类型吗&#xff1f;6、String str"i"与 …

JUC并发编程高级篇第三章之CAS[Unsafe和原子增强类]

文章目录1、CAS的简介1.1、什么是CAS1.2、使用CAS的前后对比1.3、CAS如何做到不加锁的情况&#xff0c;保证数据的一致性1.4、什么是Unsafe类1.5、CAS方法参数详解1.6、CAS的原理1.7、 CAS的缺点2、原子操作类2.1、基本类型原子类2.2、数据类型原子类2.3、引用类型原子类2.4、对…

66-插入排序

目录 1.直接插入排序 2.折半插入排序 3.在数组arr[l...r]上使用插入排序 类似打扑克牌&#xff0c;整理牌的时候&#xff0c;都是把乱的牌向已经码好的牌中插入——天然的插入排序。 1.直接插入排序 每次选择无序区间的第一个元素&#xff0c;插入到有序区间的合适位置&am…

chatGPT中国入口-ChatGPT评论文章-ChatGPT怎么用

国内怎么玩chatGPT 如果您在国内使用ChatGPT&#xff0c;主要的问题可能是连接OpenAI服务器的速度和稳定性。由于OpenAI位于美国&#xff0c;可能受到中国的网络限制和防火墙的影响&#xff0c;造成访问速度比较慢或不稳定。为了解决这个问题&#xff0c;您可以采取以下方法&a…