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

时间: 2024-11-29 06:27:46

Android API Guides---RenderScript的相关文章

android API Guides学习--Introduction(1)

android介绍: android提供了丰富的应用程序开发框架,它允许你在java语言环境中为移动设备创建独特的应用程序与环境. 1android应用程序提供多个入口点 android 应用程序是由不同的组件组合而成的,每个组件都被单独调用.activity组件提供一块屏幕作为使用者的界面.service独立的在幕后执行. 你可以使用intent类来实现组件的切换.也可以在一个app中多次调用同一个组件.例如在一个地图应用程序中显示地址的activity组件.该模型为一个单一的应用程序提供了多

Android API Guides – Introduction to Android

Android介绍 声明: 本文由Gordon翻译 发布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/index.html Android提供了丰富的应用框架以便用户能够创建使用Java的环境来在移动设备上开发有创新性的应用和游戏.Android API Guides文档将会详细描述如何使用Android不同API来开发应用. 假如你是Android开发的新手,最好首先了解一下下面列出的Android

翻译Android API Guides: App Manifest

原文在这里:http://developer.android.com/guide/topics/manifest/manifest-intro.html *Manifest译作"清单",这里沿用英文便于理解,其它术语同理. **文中链接都会跳转到android开发者网站. App Manifest 每一个应用都必须在它的根目录有一份AndroidManifest.xml文件(必须使用这个名字).Android系统必须在运行应用的任何代码之前了解一些重要信息,这些信息就来自于这份mani

Android API Guides –Device Compatibility

设备的兼容性 声明: 本文由Gordon翻译 发布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/practices/compatibility.html Android可以运行在不同类型的设备上,从手机到平板以及电视都可以运行.这些不同的设备将为开发者提供大量的潜在用户.那么为了能够让你的应用在所有的设备上运行良好,你就需要接受一些特性的多样性以及提供一个不同屏幕配置的友好的用户接口. 为了达到这样的目

【Android API Guides 简译(三)】Data Storage--Storage Options

Android提供了几种永久储存手机数据的选项,而我们选择存储的方式依据于我们存储的不同的特定需求,比如你的数据是否需要只对自己公开,数据是否可以被其他应用得到或者你想要储存多大的数据. 数据存储的方式如下: Shared Preferences 通过xml类型的键值对,存储私密的原始数据. Internal Storage 内部存储 通过手机内存存储私密数据 External Storage 外部存储 在设备外部共享里存储公开的数据 SQLite Databases Android 原生内部数

【Android API Guides 简译(一)】App Resourses--Overview

将数据与程序分开的原因,表面是为了独立的管理数据,深层原因是使App兼容不同的环境即使你的数据支持不同语言或者不同屏幕大小的特殊设备.这是非常且越来越重要的! 对于各种各样的资源,我们统一分成两种: 默认资源和针对不同环境的备选资源 举个例子,默认资源存放在res/layout/ directory下,针对于横摆方向的设备的备选资源存放在res/layout-land/ directory(横摆方向的设备的具体方式见图).当只有默认资源时,见图1.当设置了备选资源时,见图二,Android系统会

android API Guides学习--Introduction(2)

应用程序基本原理: android应用程序是用java语言编写的,android SDK工具在APK(Android package)里编译代码(数据文件和资源文件).apk是一个后缀为.apk的档案文件,1个apk文件包含了android应用程序的所有内容,apk是用来安装应用程序的基于android的设备.一旦安装了apk文件,每个app运行在自己安全的沙盒中. android操作系统是一个多用户的Linux操作系统,每一个app有一个不同的用户. 系统默认给各自的app分配一个唯一的Lin

android API Guides学习--Intent and Intent Filters

Intent是一个消息传递类,同时可以启动一些组件 作用: 1启动一个activity组件. 通过Context类的 startActivity()/ startActivity ()方法启动activity组件. 2启动一个service组件 通过Context类的startService()方法启动此组件,只能执行一次性操作(例如下载文件). 通过Context类的 bindService()方法 3发送一条广播 通过Context类的sendBroadcast(), sendOrdered

Android API Guides –System Permissions

系统权限 声明: 本文由Gordon翻译 发布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/topics/security/permissions.html Android是一个特权分离的操作系统,运行在其上的应用都有一个特定的系统身份(Linux的用户ID和组ID).系统的部分也会被分为特定的身份,Linux就是通过这个身份来区别各个应用的. 更加详细的安全特性是通过"权限"机制来控制一个进

Android API Guides – Application Fundamentals

应用基础 声明: 本文由Gordon翻译 发布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/components/fundamentals.html Android应用是用Java语言来开发的.Android的SDK工具将会把你的代码和数据以及资源文件编译到APK中,所谓的APK就是一个Android包,它是以.apk结尾的压缩包文件.APK文件包含了Android应用的所有部分,一个真正的Androi