标签:
RenderScript
RenderScript是在Android上的高性能运行计算密集型任务的框架。 RenderScript主要面向与数据并行计算的使用,虽然串行计算密集型工作负载可以受益。该RenderScript运行时将并行工作过这种多核的CPU,GPU或DSP设备上所有可用的处理器,让您专注于表达的算法,而不是安排工作或负载平衡。 RenderScript是用于进行图像处理,计算摄影或计算机视觉应用特别有用。
首先RenderScript,主要有两个概念,你应该明白:
高性能的计算内核写入一个C99衍生的语言。
一种Java API用于管理RenderScript资源的寿命和控制内核执行。
写一个RenderScript内核
一个RenderScript内核通常驻留在<project_root> / src目录/目录下的文件.RS;每个.RS文件称为一个脚本。每个脚本包含它自己的一套内核,函数和变量。脚本可以包含:
编译指示声明(版本的#pragma(1))声明此脚本中使用的RenderScript内核语言的版本。目前,1是唯一有效的值。
编译指示声明,声明此脚本反映了Java类的包名称(#pragma RS java_package_name(com.example.app))。请注意,您.RS文件必须在库项目的应用程序包的一部分,而不是。
一些数量的可调用的函数。可调用的函数是一个单线程RenderScript函数,您可以从任意参数您的Java代码中调用。这些往往是一个更大的处理管道内的初始设置或串行计算有用。
有些数字脚本的全局变量。全球脚本相当于C.可以从Java代码中访问脚本全局一个全局变量,而这些往往是用于传递到renderScript内核参数。
有些数字计算内核。内核是一个并行函数分配在整个范围内的每一个元素执行。
一个简单的内核可能如下所示
uchar4 __attribute__((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;
}
在很多方面,这等同于一个标准的C函数。第一个显着特点是适用于函数原型__attribute __((内核))。这表示该功能是一RenderScript内核,而不是一个可调用函数。接下来的特点是在参数及其类型。在RenderScript内核,这是自动填充的基础上传递给内核启动输入分配一个特殊的参数。默认情况下,内核在整个分配运行,每个元素在分配内核体的一个执行。第三个显着的特点是内核的返回类型。从内核返回的值自动写入到输出分配适当的位置。该RenderScript运行时检查,以确保该元素类型的输入和输出划分与内核的原型;如果它们不匹配,则抛出异常。
内核可能有一个输入分配,输出分配,或两者兼而有之。内核可能不会有一个以上的输入或一个输出分配。如果需要一个以上的输入或输出,这些对象应绑定到rs_allocation脚本全局和经由rsGetElementAt_type()或rsSetElementAt_type()从一个内核或可调用函数进行访问。
内核可以访问当前执行的使用x,y和z参数的坐标。这些参数是可选的,但是坐标参数的类型必须是uint32_t的。
可选init()函数。一个init()函数是在脚本第一次实例化时运行可调用函数的一种特殊类型。这使得在剧本创作自动进行一些计算。
有些数字静态脚本全局变量和函数。全球静态脚本相当于只是它不能从Java代码中设置全局的脚本。静态函数是一个标准的C函数可以从脚本中的任何内核或可调用函数被调用,但不暴露的Java API。如果脚本全球性或功能并不需要从Java代码中调用,强烈建议那些被声明为static。
设置浮点精度
您可以控制??浮点精度在脚本的要求的水平。如果不需要完整的IEEE 754-2008标准(默认情况下使用),这非常有用。以下编译指示可以设置不同级别的浮点精确度:
的#pragma rs_fp_full(如果默认是没有指定):对于需要浮点精度由IEEE 754-2008标准所列出的应用程序。
的#pragma rs_fp_relaxed - 对于不要求严格IEEE 754-2008合规性和可耐受精度要求不高的应用程序。这种模式能够为denorms冲洗到零和圆朝零。
的#pragma rs_fp_imprecise - 对于没有严格的精度要求的应用程序。这种模式下,符合下列一起rs_fp_relaxed一切:
导致-0.0操作可以返回+0.0代替。
在INF和NAN操作是不确定的。
大多数应用程序可以使用rs_fp_relaxed无任??何副作用。这可能是在某些体系结构非常有利,由于只适用于宽松的精度(如SIMD CPU指令)额外的优化。
访问RenderScript的API
当开发使用RenderScript一个Android应用程序,您可以通过以下两种方式之一访问其API:
android.renderscript - 该类包中的API可运行Android 3.0(API级别11)和更高版本的设备。
android.support.v8.renderscript - 此包中的API可通过一个支持库,它允许你使用它们运行Android 2.2(API 8级)和更高版本的设备。
我们强烈建议您使用支持库API来访问RenderScript,因为他们提供更广泛的设备兼容性。如果有必要针对开发者的Andr??oid的特定版本可以使用android.renderscript。
使用RenderScript支持库API
为了使用支持库RenderScript的API,必须将开发环境配置为能够访问它们。下面的Andr??oid SDK工具都需要使用这些API:
Android SDK工具版本22.2或更高版本
Android SDK中内建工具版本18.1.0或更高版本
您可以检查和更新在Android SDK管理器这些工具的安装版本。
要使用支持库RenderScript的API:
请确保您有所需的Andr??oid SDK版本和构建工具安装的版本。
更新为Android构建过程包括RenderScript设置的设置:
为Android Studio或摇篮基于构建
在应用程序模块的应用程序文件夹中打开的build.gradle文件。
添加以下RenderScript设置到文件中:
android {
compileSdkVersion 19
buildToolsVersion "19.0.3"
defaultConfig {
minSdkVersion 8
targetSdkVersion 16
renderscriptTargetApi 18
renderscriptSupportModeEnabled true
}
}
上述在Android构建过程控制的具体行为中列出的设置:
renderscriptTargetApi - 指定要产生的字节码的版本。我们建议您将此值设置为renderscriptSupportModeEnabled真可用的最高API级别和集。此设置的有效值为11的任意整数到最近发布的API级别。如果您的应用程序清单中指定的最低SDK版本设置为不同的值,该值被忽略,在生成文件中的目标值是用来设置的最低SDK版本。
renderscriptSupportModeEnabled - 指定生成的字节码应该回落到一个兼容的版本,如果它运行的设备不支持目标版本。
buildToolsVersion - 的Andr??oid SDK的构建工具版本使用。此值应设置为18.1.0或更高。如果未指定此选项,则使用已安装的最高版本的工具版本。你应该总是将该值设置为确保构建跨越发展的机器不同配置的一致性。
对于Eclipse
在应用程序项目的根文件夹中打开project.properties文件。
添加以下行到文件中:
renderscript.target=18
renderscript.support.mode=true
sdk.buildtools=18.1.0
上述在Android构建过程控制的具体行为中列出的设置:
renderscript.target - 指定要产生的字节码的版本。我们建议您将此值设置为可用的最高API级别,并设置renderscript.support.mode为true。此设置的有效值为11的任意整数到最近发布的API级别。如果您的应用程序清单中指定的最低SDK版本设置为较高的值,这个值被忽略,目标值设置为最小SDK版本。
renderscript.support.mode - 指定生成的字节码应该回落到一个兼容的版本,如果它运行的设备不支持目标版本。
sdk.buildtools - Android SDK的版本构建工具来使用。此值应设置为18.1.0或更高。如果未指定此选项,则使用已安装的最高版本的工具版本。你应该总是将该值设置为确保构建跨越发展的机器不同配置的一致性。
在使用RenderScript您的应用程序类,添加一个导入的支持库类:
import android.support.v8.renderscript.*;
从Java代码中使用RenderScript
从Java代码中使用RenderScript依赖于位于android.renderscript或android.support.v8.renderscript包中的API类。大多数应用程序都遵循相同的基本使用模式:
初始化RenderScript上下文。的RenderScript上下文,以创建(上下文)创建的,确保了RenderScript可以使用,并提供一个目的是控制所有后续RenderScript对象的生存期。你应该考虑上下文创建是一个潜在的长期运行的操作,因为它可以创建不同的硬件资源;它不应该是在应用程序的关键路径,如果在所有可能的。通常,应用程序将具有仅在一个单一的时间RenderScript上下文。
创建至少一个分配要传递到的脚本。一个分配是一个RenderScript对象,对于数据的固定量提供存储。在脚本中的内核采取分配对象作为它们的输入和输出,并分配对象可以在内核使用rsGetElementAt_type()和rsSetElementAt_type()时作为脚本全局约束访问。分配对象允许阵列从Java代码传递到renderScript代码,反之亦然。分配对象使用createTyped(RenderScript,类型)或createFromBitmap(RenderScript,位图)通常创建。
创建任何脚本是必要的。有使用RenderScript时,两种类型的提供给你的脚本:
ScriptC:这些是在写RenderScript内核上述用户定义脚本。每个脚本都有了RenderScript编译器,以使其易于访问从Java代码脚本反映了一个Java类;这个类将命名ScriptC_filename。例如,如果内核上面位于invert.rs和一个RenderScript上下文已经位于MRS,Java代码以实例化脚本将是:
ScriptC_invert invert = new ScriptC_invert(mRenderScript);
ScriptIntrinsic:这些内置RenderScript内核共同操作,如高斯模糊,卷积,以及图像混合。欲了解更多信息,请参阅ScriptIntrinsic的子类。
用数据填充分配。除了与android.renderscript创建分配,分配将与空数据填充第一次创建时。要填充的分配,使用分配的复制方法之一。
设置任何必要的脚本全局变量。全局可使用在同一ScriptC_filename类与名为set_globalname方法的方法进行设置。例如,为了设置一个int命名元素,使用Java方法set_elements(INT)。 RenderScript对象也可以在内核集;例如,命名为查找rs_allocation变量可以与方法set_lookup(分配)来设置。
推出相应的内核。方法推出一个给定的内核将反映在同一ScriptC_filename类命名的方法的forEach内核名称()。这些发射是异步的,并启动将在它们推出的顺序进行序列化。根据不同的参数传递给内核,该方法将采取一个或两个分配。默认情况下,内核将执行整个输入或输出的分配;执行过该分配的一个子集,通过适当Script.LaunchOptions作为最后一个参数传递给ForEach方法。
调用的功能可以用反映在同一ScriptC_filename类invoke_functionname方法推出。
复制出的数据分配对象。为了从Java代码分配访问数据,这些数据必须被复制回用分配的复制方法之一的Java缓冲区。这些功能将与异步同步内核和功能的推出是必要的。
拆掉RenderScript上下文。该RenderScript上下文可以用destroy()方法,或通过允许垃圾收集RenderScript上下文对象被销毁。这将导致任何进一步使用属于这方面的任何对象的抛出异常。
Android API Guides---RenderScript
标签:
原文地址:http://blog.csdn.net/qq_21413973/article/details/51181200