日別アーカイブ: 2011年11月6日

Android 3.x RenderScript (6) Graphics まとめ

Android には様々な描画手段が用意されています。
GPU を使って高速に描画可能な組み合わせは下記の通り。

View + onDraw (HW)
RSSurfaceView + RenderScript
GLSurfaceView + OpenGL ES 2.0 (Java)
GLSurfaceView + OpenGL ES 2.0 (NDK)
NativeActivity + OpenGL ES 2.0 (NDK)

下に行くほど低レベルな API になります。
実際に使ってみた限り、描画速度もほぼこの順番になるようです。

● RenderScript

マテリアルのセットアップやジオメトリ演算など、描画ループ自体を
Native 実行可能な C言語で記述することが可能です。
リソースの生成や初期化は Java で行い、プロジェクトも開発環境も
Java と非常に親和性が高いのが特徴です。

Compute 用の RenderScript を簡単に呼び出せます。
大量の並列演算を伴う場合も対応できます。

描画 API は OpenGL ES 2.0 の上に構築された Class ライブラリとなります。
理解してしまえば OpenGL ES 2.0 を直接扱うよりも簡単で使いやすいですが、
直接 GL 命令を使えないのでできることに限界があります。
特にぎりぎりまでハード性能を引き出すような用途には向きません。
また描画に GLSL を使う場合は OpenGL ES 2.0 の知識も必要となります。

利点
 ・C言語 + Native による高速実行。
 ・CPU アーキテクチャ非依存でどの環境でも走る。
 ・Java と親和性が高く Java のプロジェクトに組み込みやすい。
 ・描画 API が Class 化されており GL 直接より簡単。リソースも扱いやすい。
 ・rs_cl と併用できる。

欠点
 ・Android 3.0/API Level 11 以上のみ
 ・GL 周りで高速化に限界がある。
 ・描画リソースを一旦 script に渡してから描画する必要あり。

● GLSurfaceView + OpenGL ES 2.0 (Java)

GPU のハードウエアや OpenGL をよく知っていて、普段から GPU の性能を
めいっぱい使うような使い方をしている場合こちらの方が速いです。
CPU 負荷よりも GPU 負荷のほうが高いと考えられるためです。

逆にもし CPU がボトルネックとなっている場合は RenderScript の方が
向いているといえるでしょう。
アーキテクチャ非依存という点では同一で、特に OpenGL に慣れているなら
容易に扱えます。

利点
 ・CPU アーキテクチャ非依存でどの環境でも走る。
 ・Java だけで完結するため開発しやすい。
 ・GL API をそのまま使うため機能制限が無い

欠点
・Android 2.3/API Level 9 以上 (2.2 ではバグあり)
 ・低レベルな GL API をそのまま使うためコード量が増える
 ・Java によるボトルネックが考えられる

● GLSurfaceView + OpenGL ES 2.0 (NDK)

OpenGL ES 2.0 そのままで、かつ普通に C/C++ で開発できるため他の
プラットフォームで経験があるなら一番親和性が良いはずです。
ただし Java 環境への dll によるアドオンとなるため jni による通信が必要。
開発も両環境を行き来する必要が生じます。特にデバッグで。
また Native Code への事前コンパイルなので、ビルド時に実行環境が固定されます。
速度も一番引き出せる可能性がありますが、ハードに近いところまでそれなりの
知識が必要です。

利点
 ・C/C++ / OpenGL ES そのままなのでソース互換性が高い(移植しやすい,理解しやすい)
 ・GL API をそのまま使うため機能制限が無い
 ・Android 2.0/API Level 5 以上対応なので多くのデバイスで実行できる

欠点
 ・CPU アーキテクチャに依存する。ビルド時に実行環境が固定される
 ・低レベルな GL API をそのまま使うためコード量が増える
 ・リソースアクセスやイベント時に Java と通信が必要

● NativeActivity + OpenGL ES 2.0 (NDK)

Java を使わずに開発できます。
描画は EGL + OpenGL ES 2.0 のみで、全て自力で描画する必要があります。
Android の便利な Class ライブラリを使うことができません。
ほぼゲーム用。

利点
 ・C/C++ / OpenGL ES そのままなのでソース互換性が高い(移植しやすい,理解しやすい)
 ・C/C++ だけで完結し Java コードを必要としないためボトルネックがない。
 ・GL API をそのまま使うため機能制限が無い

欠点
・Android 2.3/API Level 9 以上のみ
 ・CPU アーキテクチャに依存する。ビルド時に実行環境が固定される
 ・低レベルな GL API をそのまま使うためコード量が増える
 ・使える API が限られており、Android の豊富なライブラリが使えない

続きます。次は RenderScript Compute の速度 「Android 3.x RenderScript (7) RenderScript Compute の速度」

関連エントリ
Android 3.x RenderScript (5) 任意の 3D モデルを描画する
Android 3.x RenderScript (4) script で頂点を書き換える
Android 3.x RenderScript (3) 独自シェーダーの割り当てとメッシュの描画(2D)
Android 3.x RenderScript (2) 描画と Allocation
Android 3.x RenderScript (1)