Android RenderScript 高性能计算


转载请标明出处:
http://blog.csdn.net/tyzlmjj/article/details/50747173
本文出自:【M家杰的博客】

概述
RenderScript是安卓官方的高性能计算框架。它可以自动的利用多核心CPU的性能,不需要我们自己去处理,我们只要写好算法就OK了。RenderScript 的主要应用还是在图像、视频等等的处理上。这篇博客主要是我看完官方文档之后的记录。


引入RenderScript支持库

在module的build.gradle中添加

android {

    defaultConfig {
        ……
        //启用renderscript
        renderscriptTargetApi = 18
        renderscriptSupportModeEnabled = true
    }
}

在java类中使用时引入兼容包

import android.support.v8.renderscript.*;



注意:引入上面的兼容库是官方推荐的做法,目的主要是为了APP在各个版本上的兼容性更好(可以支持最低API 8)。如果你不想引入兼容库,那就不做上面的操作,直接用import android.renderscript.*;,支持最低API 11。


RenderScript完整使用步骤

先贴一段使用RenderScript自带的图片模糊的代码,可以更好的理解。
还有一个官方的Demo可以看看

public static void blurByRenderScript(Bitmap bitmap,int radius, ImageView view,Context context)
{
    RenderScript rs = RenderScript.create(context);

    Allocation allocation = Allocation.createFromBitmap(rs, bitmap);

    ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, allocation.getElement());
    blur.setInput(allocation);
    blur.setRadius(radius);

    blur.forEach(allocation);

    allocation.copyTo(bitmap);
    view.setImageBitmap(bitmap);

    rs.destroy();
}

1. 创建一个RenderScript实例

.create()方法创建实例,有好几个重载的方法可以选。同一时间点最好只创建一个RenderScript实例

RenderScript rs = RenderScript.create(context);

2. 创建一个或多个Allocation类实例

Allocation类用于存储需要进行处理的对象数据。包含很多静态创建方法,比较常用的是createFromBitmap(…)createTyped(…)

Allocation allocation = Allocation.createFromBitmap(rs, bitmap);

3. 创建需要使用的脚本

这里脚本需要分成两类:

  • ScriptC
    这是我们自己编写的.rs文件。编译器会为我们自动映射一个java类,名字是ScriptC_文件名。假如我们写的文件是abc.rs,映射的类名就是ScriptC_abc,实例化操作如下:
ScriptC_abc abc = new ScriptC_abc(rs);
  • ScriptIntrinsic
    这是RenderScript内置的已经帮我们写好了的常用脚本,比如有高斯模糊、图像融合等等,它们都继承抽象类ScriptIntrinsic
    高斯模糊内核的实例化:
ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs,allocation.getElement());

4. 设置必要的脚本变量

RenderScript内置的脚本设置参数就不用说了,主要讲下我们自定义的脚本如何在java中赋值。
如果在你自己写的.rs文件中需要使用到额外的参数,你可以定义全局变量,比如int xyz;,那么自动映射的java类中将会自动产生get和set方法,如set_xyz(int);。这样就可以在java代码中做赋值操作,你需要做的仅仅是定义全局变量。
注意:静态变量和常量不会生成set方法,只有get。

5. 执行脚本

最终执行一般调用forEach方法。在自定义的.rs文件中,有参数的方法都会映射个java方法forEach_方法名,一个是参数跟你自己定义相同的方法,另一个重载的方法是多了一个Script.LaunchOptions类型的参数,可以设置x、y、z三个维度的起点和结束点(比如可以针对图片的某个区域进行操作)。

6. 从Allocation复制数据

将计算完成的数据从Allocation中复制出来,调用copyto(…)方法。
例如复制到一个bitmap

allocation .copyTo(bitmap);

7. 销毁RenderScript实例

最后,不要忘记销毁RenderScript实例,调用它的destroy()方法销毁。

没有更多推荐了,返回首页