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的更多相关文章

  1. Android API Guides 学习笔记---Application Fundamentals(一)

    今天开始学习google官网上的API guides ,主要读了Application Fundamentals这一章节,此章节介绍了一个App的基本组成,共包括四大部分内容. 1.      App ...

  2. Android API Guides 安卓API指导----第一部分:Introduction(介绍)

    第一部分: Introduction(介绍) 目录包含:APP  Fundamentals     (应用程序基础) Device   Compatibility(设备兼容性) System Perm ...

  3. Android API Guides –System Permissions

    系统权限 声明: 本文由Gordon翻译 公布于www.dlvoice.com 欢迎转载,但请保留此声明 原文地址:http://developer.android.com/guide/topics/ ...

  4. Android API 指南

    原文链接:http://android.eoe.cn/topic/android_sdk Android API 指南 - Android API Guides 应用的组成部分 - Applicati ...

  5. Android高效计算——RenderScript(二)

    3 RenderScript运行时层与反射层 3.1 RenderScript运行时层 RenderScript运行时层是指.rs代码运行时所在的层级.当对安卓项目进行编译的时候,.rs或者.rsh中 ...

  6. Android高效计算——RenderScript(一)

    高效计算——RenderScript RenderScript是安卓平台上很受谷歌推荐的一个高效计算平台,它能够自动把计算任务分配到各个可用的计算核心上,包括CPU,GPU以及DSP等,提供十分高效的 ...

  7. Android Dev Guides

    Android Dev Guides Google Java编程风格指南中文版 英文地址:http://google-styleguide.googlecode.com/svn/trunk/javag ...

  8. Instant Buy Android API Tutorial

    转自:https://developers.google.com/wallet/instant-buy/android/tutorial This tutorial guides you throug ...

  9. Xamarin.Android 入门之:Android API版本设置

    一.引言 Xamarin.Android有几个Android API级别设置,确定多个版本的Android应用程序的兼容性.本博客解释了这些设置意味着什么,如何配置它们,以及它们在运行时对您的应用程序 ...

  10. [翻译]API Guides - Layouts

    官方文档地址:http://developer.android.com/guide/topics/ui/declaring-layout.html PS:API Guides里面的内容不免都简单些,翻 ...

随机推荐

  1. 我使用的Sublime插件及配置

    我使用的Sublime插件及配置 增强型插件 Package Control 快捷键ctrl+~,调出命令行,运行: import urllib.request,os,hashlib; h = '29 ...

  2. HDU 1847 【巴什博弈】

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  3. King of Karaoke

    King of Karaoke Time Limit: 1 Second Memory Limit: 65536 KB It's Karaoke time! DreamGrid is performi ...

  4. 51nod 1062 序列中最大的数【打表】

    1062 序列中最大的数 题目来源: Ural 1079 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 有这样一个序列a: a[0] = 0 a[ ...

  5. [CP1804]组合数问题2

    题目大意: 给定两个数$n(n\le10^6)$和$k(k\le10^5)$,找到$k$个不同的满足$0\le b\le a\le n$的组合数$\binom a b$,求这$k$个组合数的最大值. ...

  6. linux-后台运行程序-nohup

    语法格式: nohup 命令 &                     (日志输出到当前目录nohup.out) nohup 命令 & >> 文件         (日志 ...

  7. WPF程序中的弱事件模式

    在C#中,得益于强大的GC机制,使得我们开发程序变得非常简单,很多时候我们只需要管使用,而并不需要关心什么时候释放资源.但是,GC有的时并不是按照我们所期望的方式工作. 例如,我想实现一个在窗口的标题 ...

  8. Windows 8.1中WinRT的变化(一)——新增控件

    这次WinRT的变化还是不小的,就拿新增控件来说,就有如下几种: AppBar 控件 我以前写过一篇文章接受过如何在WinRT程序中快速创建Metro风格图标,现在MS已经把他们标准化了,就不用我们自 ...

  9. 使用Python3解压gz、tar、tgz、zip、rar五种格式的压缩文件例子

    使用Python3解压如下五种压缩文件:gz.tar.tgz.zip.rar 简介 gz: 即gzip,通常只能压缩一个文件.与tar结合起来就可以实现先打包,再压缩. tar: linux系统下的打 ...

  10. sed命令使用示例

    sed -i '/mirrorlist/d' CentOS-Base-163.repo 把有mirrorlist的行删除sed -i '/\[addons\]/,/^$/d' CentOS-Base- ...