2011-12 << 2012-01 >> 2012-02

2012-01-03 (火)

*[Android] RenderScriptを使ってみる

せっかくICSの載ったGalaxy Nexusを使っていることなので,Android3.0から使えるようになったRenderScriptを試してみました.

  • C言語(ファイルはLLVMのbitcodeっぽいので他の言語もなんとかなる??)
  • NDKいらない
  • eclipse+ADTならとても簡単
  • Android3以上

アプリに含まれるのはLLVMのbitcodeなので,NDKを使った場合と違ってCPUアーキテクチャに依存しません.指定したフレームレートでグラフィックスの描画ができるので,ゲームには良さそうです.Java側とのデータの受け渡しも簡単にできそうなので使える場面は多そう.

ADT使ってるなら,javaのソースと一緒にrsファイルを置くと勝手にコンパイルされてbsファイルがrawフォルダに配置されて,読み込むのに必要なjavaファイルもgen以下に生成されます.とても簡単.

現状でどんな実装なのかわからないですが,rsForEach()とかを見る限りマルチコア環境では処理が並列実行されそう.

色々便利そうではあるのですが,まだ対応端末少なすぎるのと,デバッグの仕方がわからないのが問題かも.reDebug()で一応ログは出るみたいですが.

描画のほうはOpenGL ESとほぼ同じことができるのですが,メモリなどの確保はJava側で行って,描画を任せるという感じみたいです.rsgDrawRectとかrsgDrawTextくらいはありますが,頂点配列を作っておかないと何もできなさそう.

とりあえず四角形がくるくる回るだけのサンプルを書くとこんな感じになった.

// hello.rs
#pragma version(1)
#pragma rs java_package_name(net.binzume.android.renderscripttest)
#include "rs_graphics.rsh"

int rot = 0;

int root()
{
    rsgClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    
    // rotation
    float2  center= { rsgGetWidth() * 0.5f, rsgGetHeight() * 0.5f };
    rs_matrix4x4    rotmatrix;
    rsMatrixLoadTranslate( &rotmatrix, center.x, center.y, 0.0f );
    rsMatrixRotate( &rotmatrix, rot, 0.0f, 0.0f, 1.0f );
    rsgProgramVertexLoadModelMatrix(&rotmatrix);
    rot++;
    
    // draw
    rsgFontColor( 1.0f, 1.0f, 0.0f, 1.0f );
    rsgDrawRect( -50.0f, -50.0f, 50.0f, 50.0f, 0.0f );
    rsgDrawText( "hello", 50.0f, 50.0f );
    
    return 33; // 33ms = 30fps
}

それにしても,Android上のLLVMとdalvikは今後どうなっていくのかも気になる….

ついでに,docomoのGalaxyNexusのandroid-4.0.1はいつまで放置されるんだろう.同じ4.0でもAPI Levelが別物なので,4.0.3に早くしてほしい.

参考: