RenderScript是一个运行在高性能Android系统上计算密集型任务的框架,主要面向数据并行处理,加强的窜行计算密集工作也能从中受益。RenderScript运行时将在设备上的所有可用处理器上并行工作,例如多核CPUs,GPUs,或DSPs,是的不必将注意力放在工作调度或者负载均衡上,而是算法的表达上。RenderScript在图片处理,计算摄影和电脑视觉上的作用尤为有用。
开始运用RenderScriot之前,有两个主要的概念需要明白:
1.高性能计算内核都是用C99-derived写的。
2.使用Java API管理RenderScript资源的生命周期和控制内核执行。
渲染脚本内核:
渲染脚本为<项目>/src/directory的a .rs,每个.rs文件都是脚本。每个脚本包含自己的内核,函数和变量。
一个脚本能够包含:
1.一个编译指示声明(#pragma version(1)),用来声明当前渲染脚本内核当前的版本,目前只有1。
2.一个编译指示声明(#pragma rs java_package_name(com.example.app)),用来声明从渲染脚本中反射出来的java类的包名。.rs文件必须是应用程序包中的一部分,而不是作为项目库中的一部分。
3.一些调用函数,有一个单线程渲染脚本调用函数可以让你带任意参数声明。这在初始化设置和串行计算中很有用。
4.一些全局脚本,一个全局脚本相当于一个全局变量。这些全局脚本往往用于向RenderScript内核中传递参数。
5.一些计算内核,内核通过配置的每个元素并行计算函数。
一个简单的内核例如:
uchar4 __attribute__((kernel)) invert(char4 in, unint32_t x, uint32_t y){
uchar4 out = in;
out.r = 225 - in.r;
out.g = 225 - in.g;
out.b = 225 - in.b;
return out;
}
多数情况下,这等价于C函数。__attribute__((kernel))表示这是一个渲染脚本内核而不是一个调用函数。
6.一个可选的init()函数。
7.一些静态全局变量和函数。
设置浮点数精度:
#pragma rs_fp_full
(默认)
#pragma rs_fp_relaxed(flush-to-zero for denorms and round-towards-zero)
#pragma rs_fp_imprecise
RenderScriptAPI的使用:
两种方式
1.android.renderscript:3.0和更高
2.android.support.v8.renderscript:这是一个支持包,使用在2.2和更高
建议使用第二种方式,特定情况下开发者也可以声明第一种方式实现
android.support.v8.renderscript
为了能使用支持库中的renderscript,需要确保必要的开发环境满足一下要求
1.Android SDK Tool版本为22.2或者更高
2.Android SDK Build-tools版本为18.1.0或更高
注意:Support Library RenderScript不支持Android Studio和Gradle-based builds.
在eclipse中使用
1.确保Android SDK Tool和Android SDK Build-tools的版本
2.打开project.properties文件
3.在project.properties中添加
renderscript.target=18
renderscript.support.mode=true
sdk.buildtools=18.1.0
import android.support.v8.renderscript.*;
在代码中使用Renderscript
1.Initialize a RenderScript context
2.Create at least one Allocation
to be passed to a script
3.Create whatever scripts are necessary
4.Populate Allocations with data
5.Set any necessary script globals
6.Launch the appropriate kernels
7.Copy data out of Allocation
objects
8.Tear down the RenderScript context