android学习之路(四)----RenderScript

Renderscript学习

一、概述
    RenderScript是一个在高性能Android运行计算密集型任务的框架。RenderScript主要面向并行处理的密集型计算,虽然串行计算密集型工作负载可以受益。Renderscript运行时将所有设备上可用的处理器并行处理工作,如多核cpu、gpu,或DSPS,这样一来,开发者就能只关注表达算法,而不是安排并行算法或负载平衡。RenderScript对进行图像处理,计算摄影或计算机视觉相关的应用程序特别有用。
    学习RenderScript之前,有两个概念必须明白:
    1. 高性能计算内核都基于C99语言。
    2.使用Java API来管理RenderScript的生命周期、资源和控制内核执行。
二、编写一个RenderScript内核
1.简介
    RenderScript内核通常是存在rs文件当中,rs文件在在< project_root > / src /目录中,每个rs文件称为一个脚本。每个脚本包含自己的内核,函数和变量。一个脚本可以包含:
    1.1 编译指示声明(# pragma version(1)),声明RenderScript内核的版本在这个脚本中使用的语言。目前,1是唯一有效的值。
    1.2 编译指示声明(# pragma rs java_package_name(com.example.app))声明从这个脚本反射的Java类的包名。注意你的rs文件必须是您的应用程序包的一部分,而不是在一个库项目当中。
    1.3 一些调用函数。一个调用函数是一个单线程渲染脚本函数,你可以从Java代码调用任意参数。这些通常用于初始设置,或在一个更大的处理管道进行串行计算。
    1.4 一些数量的全局变量。脚本的全局变量相当于一个可以从Java代码访问的全局变量,而这些通常用于参数传递RenderScript内核。
    1.5一些计算内核。内核是一个在每个Element上,通过Allocation并行执行的函数。
    一个简单的内核可能看起来像下面的:

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__((kernel))。这表明这个函数是一个RenderScript内核而不是一个调用函数。下一个特点是在这个函数的形式参数及其类型,在RenderScript内核当中,这是一个特殊的参数形式,这些参数会根据传递给内核启动的输入Allocation填充进来。默认情况下,内核运行依赖于整个Allocation和该Allocation中一的每个Element。第三个显著特点是内核的返回类型,返回的值从内核自动写入输出Allocation的适当位置。渲染脚本运行时检查,以确保输入和输出的元素类型分配匹配内核的原型;如果他们不匹配,就会抛出一个异常。
    内核可能一个input Allocation,一个output Allocation,或两者兼而有之。内核可能没有超过一个输入和一个输出。如果需要多个输入或输出,应该将这些对象绑定脚本文件当中的tors_allocation全局变量,从内核访问或调用函数通过rsGetElementAt_type()orrsSetElementAt_type()
    一个内核可以访问当前执行使用的坐标x,y,和z参数。这些参数都是可选的,但必须uint32_t参数的类型。
    一个可选的init()函数。一个init()函数是一种特殊类型的调用函数,运行脚本时需要首先实例化。这使得一些计算发生在脚本自动创建的时候。
    一些静态全局变量和函数的脚本。一个静态的全局变量相当于一个全局变量,唯一的区别是,静态的全局变量不能从java代码当中进行设置,而普通的全局变量可以。一个静态函数是一个标准的C函数,可以从任何内核调用或调用函数在脚本中但不暴露于Java API。如果一个全局变量或函数不需要从Java代码调用,强烈建议那些被声明为静态的。
1.6 设置浮点精度(floating point precision)
    在脚本中,您可以控制所需的水平的浮点精度。这是有用的,如果完整的IEEE 754 - 2008标准(默认情况下使用)不是必需的。下面的语法可以设置不同的浮点精度等级:

# pragma rs_fp_full(默认),如果没有指定,浮点精度由IEEE 754 - 754标准确定。
# pragma rs_fp_relaxed——应用程序不需要严格的IEEE 754 – 2008标准,可以容忍不是那么精确。这种模式使flush-to-zero denorms和round-towards-zero。
# pragma rs_fp_imprecise——应用程序没有严格的精度要求。这种模式使一切rs_fp_relaxed连同以下:

操作导致结果是-0.0的,返回+0.0
操作INF和NAN是未定义的。
大多数应用程序都可以使用rs_fp_relaxed,没有任何副作用。这对于那些只能通过降低精度来实现额外的优化的程序架构来说,是非常有益的(如CPU SIMD指令)。

三、访问RenderScript的API
    在开发Android应用程序时,您可以通过两种方式来访问RenderScript的API:

1 android.renderscript——这个类的API包可用设备上运行Android 3.0(API级别11)和更高。
2 android.support.v8.renderscript——在这个包中可用的API支持库,它允许您使用设备上运行Android 2.2(API级别8)和更高。

    我们强烈建议使用支持库api来访问RenderScript,因为他们提供了一个广泛的设备兼容。针对特定版本的Android开发人员可以使用Android.renderscript,如果必要的话。

1. 使用RenderScript支持库api
    为了使用支持库RenderScript api,您必须配置您的开发环境能够访问它们。   
    Android SDK Tools版本22.2或更高版本  
    Android SDK Build-tools修订18.1.0或更高  
Eclipse当中需要以下三步:
第一步、确保你有安装必需的Android SDK版本和构建工具版本。
第二步、在project.properties当中加入下面的内容

renderscript.target=18
renderscript.support.mode=true
sdk.buildtools=18.1.0

第三步,在.java文件当中进行使用

import android.support.v8.renderscript.*;

project.properties设置控制Android构建过程中的特定行为:
3.1renderscript.target——指定生成的字节码版本。我们建议您设置这个值为最高的可用的API级别,同时设置 renderscript.support.mode = true。这个设置的有效值是任何整数值从11到最近发布的API级别。如果你的最低SDK版本中指定您的应用程序清单文件设置为较高的值,这个值将被忽略,并被设置为清单文件当中的minSdkVersion。  
3.2 renderscript.support.mode——当运行的设备不支持指定的renderscript.target,是否回滚到可兼容版本
3.3 sdk.buildtools - ——Android SDK的版本使用构建工具。这个值应该设置为18.1.0或更高。如果没有指定这个选项,默认是安装的最高版本

Android Studio当中,需要进行如下方式:
第一步、在app的build.gradle当中添加如下代码

sourceSets {
        main {
            dirs.each { dir ->
                java.srcDirs "src/${dir}/java"
                res.srcDirs "src/${dir}/res"
            }
        }
        androidTest.setRoot('tests')
        androidTest.java.srcDirs = ['tests/src']
        defaultConfig {
            renderscriptTargetApi 18
            renderscriptSupportModeEnabled true
        }
    }

第二步、添加依赖

compile files(
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值