Android Renderscript计算(三)

来源:互联网 发布:减肥药真的有用吗 知乎 编辑:程序博客网 时间:2024/04/29 04:10

调用Renderscript代码

你能够通过由实例化的类(ScriptC_script_name)来创建一个Renderscript对象从Android框架代码中调用Renderscript。这个类包含了一个forEach_root()方法,它会调用rsForeach()方法。你能够传递给它与Renderscript运行时级别调用相同的参数。这种技术允许你的Android应用程序把高精度的数学计算转交给Renderscript。

在Android框架层次调用Renderscript的方法:

1.  在你的Android框架代码中分配Renderscript所需要的内存。对于Androi3.2(API Level 13)以前的版本,需要分配输入和输出内存。Android4.0(API Level 14)以后的平台版本只需要分配其中之一的内存或两个都分配。

2.  创建ScriptC_scritp_name类的一个实例。

3.  调用forEach_root()方法,并传入分配的内存、Renderscript和其他的可选的用户定义的数据。输出内存中将会包含Renderscript的输出结果。

以下示例来自HellCompute示例,它处理一张位图,并输出它的黑白版本。CreateScript()方法安装前面描述的步骤来执行。这个方法调用Renderscript对象,执行mono.rs脚本,把最终的处理结果位图保存在输出的内存中,然后把处理后的位图显示在屏幕上:

package com.example.android.rs.hellocompute;

 

import android.app.Activity;

import android.os.Bundle;

import android.graphics.BitmapFactory;

import android.graphics.Bitmap;

import android.renderscript.RenderScript;

import android.renderscript.Allocation;

import android.widget.ImageView;

 

public class HelloCompute extends Activity {

 private Bitmap mBitmapIn;

 private Bitmap mBitmapOut;

 

 private RenderScript mRS;

 private Allocation mInAllocation;

 private Allocation mOutAllocation;

 private ScriptC_mono mScript;

 

 @Override

 protected void onCreate(Bundle savedInstanceState) {

     super.onCreate(savedInstanceState);

     setContentView(R.layout.main);

 

     mBitmapIn = loadBitmap(R.drawable.data);

     mBitmapOut = Bitmap.createBitmap(mBitmapIn.getWidth(), mBitmapIn.getHeight(),

                                      mBitmapIn.getConfig());

 

     ImageView in = (ImageView) findViewById(R.id.displayin);

     in.setImageBitmap(mBitmapIn);

 

     ImageView out = (ImageView) findViewById(R.id.displayout);

     out.setImageBitmap(mBitmapOut);

 

     createScript();

 }

 private void createScript() {

     mRS = RenderScript.create(this);

     mInAllocation = Allocation.createFromBitmap(mRS, mBitmapIn,

         Allocation.MipmapControl.MIPMAP_NONE,

         Allocation.USAGE_SCRIPT);

     mOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());

     mScript = new ScriptC_mono(mRS, getResources(), R.raw.mono);

     mScript.forEach_root(mInAllocation, mOutAllocation);

     mOutAllocation.copyTo(mBitmapOut);

 }

 

 private Bitmap loadBitmap(int resource) {

     final BitmapFactory.Options options = new BitmapFactory.Options();

     options.inPreferredConfig = Bitmap.Config.ARGB_8888;

     return BitmapFactory.decodeResource(getResources(), resource, options);

 }

}

以下是从另一个Renderscript文件中调用Renderscript的方法:

1. 在Android框架代码中分配由Renderscript所需要的内存。对于Android3.2平台和之前的版本,要同时分配输入和输出内存。Android4.0平台版本之后可以根据需要来分配输入和输出内存。

2. 调用rsForEach()方法,并传入分配的内存和可选的用户定义的数据。输出内存中会包含Renderscript的输出结果。

rs_script script;
rs_allocation in_allocation;
rs_allocation out_allocation;
UserData_t data;
...

rsForEach(script, in_allocation, out_allocation,&data,sizeof(data));

在这个例子中,假定在Android框架层脚本和内存已经被分配和绑定,并且UserData_t是一个被事前声明的结构。把这个结构的指针和它的大小传递一个rsForEach()方法,这是一个可选的参数。如果你的Renderscript需要一些输入内存中之外的信息,就可以使用这个参数。

设置浮点精度

你能够定义计算规则所需要的浮点精度。如果你需要比IEEE 754-2008标准(默认使用的标准)更小的精度,使用这个定义是有用的。你能够使用下列编译指令来定义脚本的浮点精度级别:

1. #pragma rs_fp_full(如果没指定,这是默认的精度级别):指示应用程序需要由IEEE 754-2008标准所描述的浮点精度。

2. #pragma rs_fp_relaxed:对于不需要严格遵从IEEE 754-2008标准要求精度的应用程序可以使用这种编译指令,对于de-norms(去模)计算这种模式启用了flush-to-zero(清零),并且round-towards-zero(向零方向舍入)。

3. #pragma rs_fp_imprecise:对于没有严格精度要求的应用程序使用这种模式。这种模式沿用了rs_fp_relaxed模式以下的所有规则:

   操作结果-0.0会使用+0.0来代替返回;

   没有定义有关INF和NAN的操作。

原创粉丝点击