2013年

10月

23日

【Android NDK】ファイル読み込みの速度比較

 

前回紹介したファイル読み込み方法のそれぞれの処理速度を比較してみた。

 

当初は全ての方法をチェックするべくAndroid OS2.3.3以降のエミュレータで検証するつもりだったのだが、OS2.3.3、OS3.0系統のエミュレータではよくわからないエラーが生じてアプリが起動できす、OS4.0系統のエミュレータではメモリ不足で起動することすら出来ず・・・という諸事情により、結局自分の端末で検証することにしました。

 

私の端末はOS2.2なのでAssetManagerの方式だけは検証できませんでした。今回は「SDカード読み込み」、「バイト配列読み込み」、「ZLib読み込み」の3種類だけを比較します。

 

図の見方

 

①ReadModel Process

MMDモデルの読み込み時間

ファイル読み込みの処理方法別でここに影響が出る

 

②ConvertModel Process

描画専用モデルへの変換に掛かる時間 処理コードはC/C++

ファイル読み込みとは関係ない

 

③ReadImage Process

テクスチャに使う画像ファイルの読み込み時間 処理コードはJava

ファイル読み込みとは関係ない

 

④SetBuffer Process

OpenGLの頂点バッファとテクスチャバッファの作成とデータ設定に掛かる時間

処理コードはC/C++ ファイル読み込みとは関係ない

 

今回は①だけを見ていきます。 単位は全て秒です。

 

※処理時間は疎らで実行するたびに変わります。

出てくる値が最速速度というわけではありません。

SDカードのファイル読み込み

Java側でSDカードのパスを取得

ファイル読み込みにはC標準関数のfreadを使用

 

Debugモード

 

Releaseモード

バイト配列読み込み

Java側でAssetManagerからInputStreamを取得してバイト配列にデータを格納

データ読み込みには自作クラスを使用

 

Debugモード

 

Releaseモード

ZLibでAPKファイル読み込み

Java側でapkファイルのパスを取得

ファイル読み込みにはminizipのunzReadCurrentFileを使用

 

Debugモード

 

Releaseモード

 

Debug・Releaseで3種類の方法を見ましたが、どれも似たような値でよくわかりませんね。どの処理もあまり速度は変わらないように見えますが、さらに正確な値が出せるように何回もファイル読み込みをさせてから結果を計測してみましょう。

 

今度は各読み込み方法で、モデルを50回読み込ませてみます。

SDカードのファイルを50回読み込む

バイト配列から50回読み込む

ZLibでAPKファイルを50回読み込む

ファイル読み込み処理速度比較
処理法

処理回数 1回

(Debug/Release)

処理回数 50回
(Debug/Release)
SDカード 0.65秒 / 0.29秒 28.25秒 / 13.89秒
バイト配列 0.59秒 / 0.36秒 26.75秒 / 11.84秒
ZLib 0.7秒 / 0.36秒 33.03秒 / 18.38秒

 

結果はこのようになりました。

処理速度は遅い順からZlib < SDカード < バイト配列のようです。

 

やはりファイルへアクセスする関数は何度も呼び出すと遅くなるようです。バイト配列法のように最初にまとめてデータを受け取るほうが良いかもしれません。あとは読み込み方を少し工夫すれば全体的にもう少し速くなると思います。

 

ZLib法は圧縮したデータからデータを読み取っている影響なのか、他より少々時間が掛かるようですね。AssetManagerをネイティブ側へ渡せる場合、どのくらい速いのかはわかりませんが少なくともZlibやSDカードよりは速そうです。

 

あと処理別に時間を計ってわかりましたが、画像読み込みが一番遅いです。Java側から読み込んでいるので、ここをネイティブ化できればさらに速くなりそうです。

 

画像操作のライブラリは有名どころだと「OpenCV」、「SDL_image」、「DevIL」等があります。OpenCVとSDL_imageはAndroid用ライブラリがそれぞれの公式サイトから配布されていますのでそちらをビルドして使用できます。SDL_imageを使うにはSDLのAndroid用ライブラリも必要になります。ちなみに開発に最小限必要なAPIレベルは10(Android OS 2.3.3)らしいです。私の環境じゃ使えない・・・・・・

 

単体のフォーマットだけでいいならlibtiff、libpng、libjpg等もあります。有名どころのフォーマットはAndroidでビルドをしてる先駆者の方々が居るので、そちらを見ていただければ充分に参考になると思います。

 

DevILも自前でビルドすれば使えそうですが、内部で使用してるライブラリの数が多く、それらも個別にAndroidに対応させる必要があるので環境を整えるまでが面倒そうです。

ライブラリ別対応画像フォーマット
ライブラリ名 扱える画像フォーマット
OpenCV BMP, JPG, PNG, PNM, RAS, TIFF
SDL_image BMP, GIF, JPEG, LBM, PCX, PNG, PNM,
TGA, TIFF, WEBP, XCF, XPM, XV
DevIL 多すぎるのでコチラを参照すべし