• スポンサードリンク

libjpeg-turboでNEONの効果を確かめてみた

Android NDK

気分転換に、前から試してみたかったlibjpeg-turboをテストしてみた。
ビルド方法とかは先輩方に任せるとして、とりあえず結果だけ。一目瞭然だね。
EffectOfNEONNEONの有効無効によるMJPEG展開&描画速度への影響
WiiUからのHDMI出力をUSB接続のフレームグラバーFEBON168経由でMJPEGフレームとして取得してます(表示内容によってもMJPEGの展開は時間が変わっちゃうからいつも同じ画面でテスト)。測定時間約3分間、300〜5000フレームぐらいの平均値です。測定の時間も多少含んでいるのと、スマホやタブレットのCPU/GPUはいつも同じようには働いてくれない(温度とか他のプロセスの影響を受ける)ので±10%程度は誤差があります。
なので、あくまでも目安ですが、NEONを有効にすると60%ぐらいの時間で処理できるみたい。描画は変更していないのとここでの測定時間の1〜5%程度なので、この差はNEONの有無によるMJPEG展開の速度の差と言っていいでしょう。
ちなみに、NEONを無効にしたlibjpeg-tuboとlibjpegは大体同じぐらいの処理時間でした。
しかも、自前でNEONの有無で切り替えしないといけないのかと思ってたら、ソースを見た限りでは内部で/proc/cpuinfoを読んでNEONのサポートしているかどうかも自動で判別してくれてそうなので素晴らしいです。
libjpeg互換APIしか使ってなければ、ライセンス的には今MJPEGの展開に使っているlibjpegと同じでいけそうなので、もう少しテストしてからすげ替えようかなぁ。

最初に「ビルド方法とかは先輩方に任せる」とか言っときながらも少しだけ。
自分は、$NDK/sources/serenegiantの下によく使うnativeライブラリを放り込んでそれぞれの中に専用のAndroid.mkを作成、使う側のAndroid.mkに

みたいな記述と、次のようなstaticリンクまたはsharedリンクするための記述を追加してビルドしています。

(上の例では最後の行以外はコメントアウトされているからね)
これだと別に共有ライブラリ・スタティックライブラリとしてビルドしたのをコピーしたり、libs配下にコピーするための記述をAndroid.mk内にしなくても済むので便利。
自分の場合は、libpngとかlibjpeg、libzip、Boost、rapidjson辺りと自前のライブラリが居ます。
外部モジュールは、NDK_MODULE_PATHにパスを追加すれば他の場所に有っても大丈夫ですが、外部モジュール専用の場所を作った方がいいのかなぁと思います。
欠点は、

  • 共有ライブラリとして使う場合でもビルドしちゃうので各apk毎に共有ライブラリのタイムスタンプが変わっちゃう
  • プロジェクトをcleanした後のビルドに時間がかかる(´・ω・`)
  • 外部モジュールのデバッグがめんどい(あらかじめ別途専用のプロジェクトでデバッグしたのをコピーするのが一番楽)

何事にもメリット・デメリットが有るということで。

お疲れ様でした。

« »

  • スポンサードリンク

%d人のブロガーが「いいね」をつけました。