Android API Guides---RenderScript

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上下文对象被销毁。这将导致不论什么进一步使用属于这方面的不论什么对象的抛出异常。

原文地址:https://www.cnblogs.com/gavanwanggw/p/7261420.html