Android RenderScript 的使用基礎篇

準備上4.0項目,最近接觸API 的時候看到瞭RenderScript 。通過運行google 那幾個項目發現這個真是一個非常不錯的API,但是google 所提供的文檔非常少,有助於瞭解計算機圖形計算,雖然我們做應用編程的不一定要涉及這塊,但涉獵一下總是不錯的。
RenderScript 是Android 平臺上的一種類C腳本語言。要在我們程序上實現RenderScript 渲染功能,最少需要實現的幾個功能如下,以一個Hello Wold 為例:
1. helloworld.rs 實現RenderScript 的代碼
2. RenderScriptRS.java 一個輔助類,簡化操作RenderScript (非必要)
3. RenderScriptView.java  一個繼承於RSSurfaceView的類,用於顯示RenderScript 的渲染或者用來處理用戶的觸摸等視圖
4. RenderScriptHelloWorldActivity.java 這個不用多說,Android 應用程序的界面類
 
當創建一個RenderScript 的項目的時候,必須在包名下創建一個以rs為後綴的文件(位於我們Activity 同包名下),如本篇文章使用的helloworld.rs文件.
#pragma version(1)
#pragma rs java_package_name(com.xuzhi.rs.helloworld)

#include "rs_graphics.rsh"

int gTouchX;
int gTouchY;

void init(){
    gTouchX=50.0f;
    gTouchY=50.0f;
}

//application main
int root(void){
    rsgClearColor(0.0f,1.0f,0.0f,0.0f);//顏色更改為no red,full green,no blue,no opacity ,的RGBA值
    rsgFontColor(1.0f,0.0f,1.0f,1.0f);//設置字體顏色
    rsgDrawText("my first renderscript application",gTouchX,gTouchY);//根據應用傳上來的x,y 將字畫在屏幕對應的坐標上
    rsDebug("======my renderscript debug========",rsUptimeMillis());//打印日志
    return 20;

 註解:
#pragma:簡單的可以理解告訴或者通知編譯器編譯這個文件時需要的參數或者指定編譯的版本等,跟編譯器有關。
void init():這個函數作一些初始化動作
int root(viod):程序入口,根據返回值(ms)作刷新。比如上面寫的20相當於每20毫秒刷新一次。
      root 函數下rsgClearColor,rsgFontColor,rsgDrawText都位於rs_graphics.rsh頭文件下。
       rsDebug是打印日志函數,位於rs_core.rsh頭文件。
   在上面的代碼中,日志將己每20毫秒打印一次這樣的日志:03-01 11:09:18.289: D/RenderScript(1838): ======my renderscript debug======== 600462  0x9298e
    rsUptimeMillis則定義在rs_time.rsh頭文件中。
目前有關於RenderScript調用的函數位於我們SDK目錄下(platforms/android-*[目前11-15]/renderscript/include)目錄裡面的頭文件中。
 
好瞭,rs文件己經編寫完成,接著往下走。
 下一步,為瞭方便調用RenderScript 這裡創建瞭一個輔助類,RenderScriptRS.java。
 
 /**
 * Render Script help
 * @author terry
 *
 */
public class RenderScriptRS {

    private RenderScriptGL mRS;
   
    private ScriptC_hellowold mScript;
   
    public RenderScriptRS(RenderScriptGL rs,Resources resource) {
        // TODO Auto-generated constructor stub
        mRS=rs;
        mScript=new ScriptC_helloworld(mRS, resource, R.raw.hellowold);
        mRS.bindRootScript(mScript); //綁定腳本
    }
   
    /**
     * 傳入坐標
     * @param x
     * @param y
     */
    public void onActionDown(int x,int y){
        mScript.set_gTouchX(x);
        mScript.set_gTouchY(y);
    }
}

目前我們所做的一切都是要使用到的RenderScriptGL(RenderScript 圖形的衍生),實例化RenderScriptGL並綁定腳本。如果你的開發ADT高於或者是1.5的話Eclipse 會根據你的rs文件生成ScriptC_你的rs文件為名的java類。如上面代碼的ScriptC_helloworld一樣,並且在資源目錄res/raw生成一個.bc的文件,在實例化ScriptC_hellowold會需要傳進去。
 
 下一步,創建RenderScriptView.java,讓其可以顯示在界面上。
import android.content.Context;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScriptGL;
import android.renderscript.RenderScriptGL.SurfaceConfig;
import android.view.MotionEvent;

public class RenderScriptView extends RSSurfaceView {

    private RenderScriptGL mRS;

    private RenderScriptRS mRender;

    public RenderScriptView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        initRenderScript();
    }

    /**
     * 初始化RenderScriptRS
     */
    private void initRenderScript() {
        if (mRS == null) {
            RenderScriptGL.SurfaceConfig config = new SurfaceConfig();
            mRS = createRenderScriptGL(config);

            mRender = new RenderScriptRS(mRS, getResources());

        }
    }

    @Override
    protected void onDetachedFromWindow() {
        // Handle the system event and clean up
        mRender = null;
        if (mRS != null) {
            mRS = null;
            destroyRenderScriptGL();
        }
    }

    @Override
    protected void onAttachedToWindow() {
        // TODO Auto-generated method stub
        super.onAttachedToWindow();
        initRenderScript();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        /**
         * 傳入點擊坐標www.aiwalls.com
         */
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            mRender.onActionDown((int) event.getX(), (int) event.getY());
            return true;
        }

        return false;
    }

 
 RSSurfaceView擴展自SurfaceView,用來顯示這些需要渲染的圖形界面。
 上述代碼的initRenderScript方法,如果RenderScriptGL 未實例化,就需要創建一個SurfaceConfig(這是用來控制深度的顏色,深度緩沖區等等,這裡使用默認),並且讓它實現自身的onTouchEvent事件,傳入x,y坐標軸進入RenderScript,改變文本顯示的位置(跟隨鼠標的點擊點變化)。
最後的界面隻需要讓它顯示出來即可:
public class RenderScriptHelloWorldActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new RenderScriptView(this));
    }

 這一系列的步驟可以用一張圖來做說明,詳細的規劃瞭RenderScript 的圖形概述:

 

 

 這是一個簡單的DEMO,介紹瞭RenderScript 使用的一些基本步驟,詳細的使用後面會慢慢提到。最後通過上面的代碼可以看到的運行效果如下:

 

 

另外,後文還會提供一些詳細的文檔和例子。比如:

rs_graphics
rs_core
rs_math
rs_time
 上面這四個的頭文件的API。

代碼可以在Android 4.0中找到,RenderScript->Helloworld。
註:模擬器無法運行。

 

摘自 Terry_龍

發佈留言