7月 19

前回のエントリーは メリットとデメリット についてでした。

今回は、イベント処理を含めた HalloWorld について説明します。
RS内で使用している型やメソッドなどについては、RenderScriptのReferenceに記載されているので、そちらをご覧ください。

ファイル構成

プロジェクト内は以下のようになっています。

drawableには、アプリアイコンしか入っていません。
strings.xmlは、アプリ名の要素しか定義していません。
rawhelloworldscript.bcは、自動生成されます。

コード

  • MainActivity.java
  • 1
    2
    3
    4
    5
    6
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            texture = (MainTextureView) findViewById(R.id.texture);
        }

    layout.xmlを設定しているだけです。

  • MainTextureView.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
        public MainTextureView(Context context, AttributeSet attrs) {
            super(context, attrs);
            if (rs == null) {
                RenderScriptGL.SurfaceConfig config = new RenderScriptGL.SurfaceConfig();
                rs = createRenderScriptGL(config);
            }
            if (script == null)
                script = new HelloWorldScript(rs, context.getApplicationContext(), getResources());
        }

    RSTextureViewからRenderScriptGLを生成します。
    Android 4.0 (APILevel 14)以下のときは、RSSurfaceViewを使ってください。
    使い方は、ほとんど同じです。

  • HelloWorldScript.java
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        protected HelloWorldScript(RenderScriptGL rs, final Context c, Resources res) {
            script = new ScriptC_HelloWorldScript(rs, res, R.raw.helloworldscript);
           
            text = Allocation.createFromString(rs, "Hello World", Allocation.USAGE_SCRIPT);
            font = Font.create(rs, res, "fantasy", Font.Style.NORMAL, 20);
            script.set_gFont(font);
            script.set_gText(text);
           
            rs.bindRootScript(script);
        }
       
        protected void touchEvent(float x, float y) {
            script.invoke_setTouchPosition(new Float2(x, y));
        }

    このクラスについても、今の段階では悩むところは無いと思います。
    なぜ、このクラスをつくったかというと、RSとJavaのアクセス部分は別にしておいた方が可読性が高くなるためです。
    とくに気にしないのであれば、MainTextureView.javaに含めても良いでしょう。
    唯一、注目して欲しいところは4行目で、Stringに必要なメモリ領域をAllocationとして確保している部分です。
    charで文字を渡しても良いのですが、Allocationを使ったほうが楽です。

  • HelloWorldScript.rs
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #pragma rs java_package_name(jp.kiroru_inc.rs_hello_world)

    #include "rs_graphics.rsh"

    rs_allocation gText;
    rs_font gFont;
    float2 gTouch;

    void setTouchPosition(float2 pos) {
        gTouch = pos;
    }

    int32_t root() {
        rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        rsgFontColor(0.8f, 0.3f, 0.2f, 1.0f);
       
        int32_t left = 0;
        int32_t right = 0;
        int32_t top = 0;
        int32_t bottom = 0;
        rsgBindFont(gFont);
        rsgMeasureText(gText, &left, &right, &top, &bottom);
       
        int32_t x = gTouch.x - (right - left) * 0.5f;
        int32_t y = gTouch.y - (bottom - top) * 0.5f;
        rsgDrawText(gText, x, y);
       
        return 0;
    }

    1行目のjava_package_nameは、自動生成されるリソースの展開先です。
    ここで指定したパッケージ名として、genフォルダ直下にScriptC_HelloWorldScript.java (ScriptC_xxx.java: xxxは.rsのファイル名)などが作成されます。
    JavaからRSファイルに定義したメソッドや変数にアクセスするためには、この自動生成されたクラスを介して行います。
    13行目のinit32_t root()がメインループになる部分です。
    メソッド内の最後のreturn 0;ですが、この値が再描画の更新間隔になります。
    今回は、0を返しているので、タッチイベントが発生したときにシステムが自動的に再描画してくれます。
    例えば、50を返すと、20fpsで描画されます。

RSで自動生成されるもの

Javaから呼び出すものについてまとめました。
直接呼び出さないものについては記載していません。

※ scriptは.javaで定義した変数です。

  • xxx.bc
  • xxx.rsを作成するとres/rawに作成されます。
    私は、過去にこのファイルをEclipseで開こうとしたとき、Eclipseが落ちたので開かないほうが良いです。
    今も落ちるのかどうかはわかりません。

  • ScriptC_xxx.java
  • xxx.rsを作成すると自動生成されます。

  • script.set_xxx
  • xxx.rs内で定義したグローバル変数へのアクセサメソッドです。

  • script.invoke_aaaaa
  • xxx.rs内で定義したaaaaaというメソッドへのアクセサメソッドです。

他にも自動生成されるものはありますが、今回のサンプルで出てきていないものについては省きました。
それらについては、随時説明していきます。

今回のサンプルは Google Code で公開しています。
次回は、構造体を使ったサンプルを考えてます。

このエントリーの内容について
クリエイティブ・コモンズ・ライセンス
RSHelloWorld by Selphy, Kiroru Inc. is licensed under a Creative Commons 表示 – 非営利 – 継承 3.0 非移植 License.


Posted by selphy

Tagged with:
preload preload preload