RenderScriptを使うことでCPUの種類や、GPUの種類に関わらずNDKのような高速な計算とOpenGLを使った描画が出来ます。
仕組みはAPKを作る時点ではハードウェに依存しない中間バイトコードを使用して実行時にコンパイルを行うというもの。
これにより多種有るARMだけでなくx86ですらも高速計算してくれるし、計算の内容がシンプルでハードウェアが対応しているならGPGPUも利用できます。
しかしながらJellyBeanでRenderScriptによる描画が非推奨になりました。
描画関連の機能を使おうとすると警告が出てきます。
RenderScriptを使用して描画するより慣れているOpenGLを使う人が多いという理由らしいけれど、
別の原因としてRenderScriptはどんな環境でも適用できるように機能が絞られているのに対してGPUは日に日に多機能化する一方。
RenderScriptでOpenGLの分野をカバーするのは無理があるということじゃないかと思う。
ということで、Androidで高速な描画をしたい場合はOpenGLを学ぶことをおすすめします。
一方、高速計算を行うためのRenderScriptは強化されています。
最大のトピックスはNEON対応。これによりマルチメディア関連の処理が高速化されることが期待できます。
ということで、RenderScriptによる高速化がどの程度の効果があるか計測してみました。
サンプルにあるHelloComputeを実行した場合と、同じ処理をJavaで行った場合の処理の比較です。
計測を行ったのは
GalaxyNexus(Texas Instruments OMAP4460+PowerVR SGX540)
Nexus7(nVidia Tegra3)
他のプロセスによる影響などを考えてアプリを10回起動させた結果は以下のとおり
これによると倍以上早くなっているように見える。
次に、同じ処理を50回連続した場合の推移
GalaxyNexusでもNexus7でもJavaでの実行時に一定時間以降から速度が高速化されていて、おそらくJavaがJITで最適化された結果かと思われる。
Nexus7の場合JavaでもGalaxyNexusのRenderScript以上の性能を見せている。
今回の処理は簡単なビット演算が殆どで浮動小数点などRenderScriptが得意とする分野が使われていないという問題はあるものの、割とJava任せでも良いんじゃないかなと思います。
RenderScriptによる高速計算
2012/10/15 12440hit
関連日記
Gradle SyncでgetPackageApplication()の警告を解決した
Kotlinでif let elseをやりたいときはletでなくalsoを使おう
Android Wear2.0 Watch face Complicationsを作る 多データ型対応編
Android Wear2.0 Watch face Complicationsを作るDataSync編
Android Wear2.0 Watch face Complicationsを作る 基礎編