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. 手动破解的 Linux下的Maltab 2014b

    人人网上一个很不错的东东,转发全文如下: 好久没有写日志了,今天更新一篇. 承蒙 @刘慎修(263525031 )修哥分享的各种激励,发布一发我自创的黑科技. Maltab 2014b 发布了,但是只 ...

  2. Sqlite 教程

    http://www.runoob.com/sqlite/sqlite-functions.html

  3. 将本地访问ip映射成域名

    通过修改以下地址 C:\WINDOWS\system32\drivers\etc\hosts 加进你自己的如: 192.168.1.101  www.helloworld.com 配置nginx代理u ...

  4. jquery做一个表单验证

    正则表达式的写法: var re=new RegExp('规则', '可选参数');var re=/规则/参数;(这个最常用) 正则表达式的规则 和其他语言的正则表达式规则一样,可以参考我的另一边博文 ...

  5. 【linux高级程序设计】(第十五章)UDP网络编程应用 2

    UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网 ...

  6. mysql 故障整理

    mysql> system mysqldump -uroot -p -B mingongge >/root/mingongge_bak.sql Enter password: mysqld ...

  7. UVA 624 CD【01背包+路径记录】

    You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music is o ...

  8. Maven笔记:

    启动tomcat的时候报这样的错误:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncoding ...

  9. JQuery里面的知识

    JQuery是一个javaScript库 JQuery极大的简化了javaScript编程 通过点击 "TIY" 按钮来看看它是如何运行的. 演示JQuery的hide函数,隐藏了 ...

  10. Missing Ranges -- LeetCode

    Given a sorted integer array where the range of elements are [lower, upper] inclusive, return its mi ...