Androidアプリ開発::drawBitmap考察
前回のエントリの最後に追記として、ePadはPortraitよりもLandscapeの方が動作が速い、と書きました。より正確には、画面描画が速い、ということだと思います。そこで、描画速度を計測する簡単なアプリを作ってみました。


SurfaceViewを構築し、そこに100回画像を貼り付けて表示する時間を計測し、フレームレートを計算します。SurfaceViewはダブルバッファリングをシステムがやってくれるそうで、二枚のプレーンに交互に描いて表示する関係でちらつきますが、今回の趣旨とは関係ないのでそれは放置します。何を言ってるのか分からない人は、最後に今回のアプリのURLを貼っておきますので、自分で試してみてください。
上の写真の左がLandscapeでの結果、右がPortraitでの結果です。余談ですが、IS03はメモリ液晶に表示されたアイコンの向きで、今端末がLandscape状態なのかPortrait状態なのか分かります。それだけではナンですので、端末はLandscapeなのに画像を反時計回りに90度回転させて貼り付けることでPortraitに見せかけるもの(Portrait Fake)と、その反対にPortraitでLandscapeに見せかけるもの(Landscape Fake)も作ってみました。まずはIS03の結果から。それぞれ2回計測しました。
Landscape


一回目:28.91 fps 二回目:29.73 fps
Portrait


一回目:31.97 fps 二回目:33.15 fps
Portrait Fake


一回目:29.07 fps 二回目:29.43 fps
Landscape Fake


一回目:28.69 fps 二回目:33.03 fps
IS03はLandscapeよりもPortraitの方が、ほんの僅かに速いようですが、ほぼ誤差の範囲です。回転させることによる速度低下も、誤差程度しか見受けられません。
これを踏まえた上で、ePadを試してみましょう。こちらは3回ずつ計測しています。
Landscape



一回目:32.08 fps 二回目:32.89 fps 三回目:31.87 fps
意外なことに、IS03のPortraitとほぼ同じ値を出しています。と言いたいところですが、明らかにIS03よりもドロイドの密度が低い。どうやら画面サイズに対して、ドロイドが小さく表示されているようです。IS03の方が解像度は高いのに。うすうすは気が付いていたのですが、どうもAndroidはそのまま画像を貼ったつもりでも、dpiに合せて適当なサイズに変えられてしまうようですね。まあその辺は後々ということで、今回はIS03とePadの直接比較は参考程度にしておいてください。
Portrait



一回目:7.59 fps 二回目:7.72 fps 三回目:7.51 fps
さて問題のPortraitですが…想像以上にヒドいですね。これでUIをスクロールしようとか、カクカクもいいとこです。想像ですがこの遅さは、ビデオチップだかDACだかが本来ピボットに対応してないところを、OS側が無理やりソフトウェア側でVRAMを横にして描画してるんじゃないかと。この端末はPortraitで使っちゃいけないというのがよく分かります。
そこで、縦長の画面として使いたい場合でも、Landscapeのまま回転させて描いてみればいいじゃんってのが次なんですが…
Portrait Fake



一回目:27.20 fps 二回目:31.93 fps 三回目:30.94 fps
Portraitよりも圧倒的に速く、Landscapeと比べても回転による速度低下はほんの僅かで描画できました。一度にたくさん描画したり、もっと大きな画像を描画した場合は多少変わってくるでしょうが、それでもPortraitよりも、Landscapeで回転させた方が速くなるという状況は少なくないのが分かると思います。
Landscape Fake



一回目:6.86 fps 二回目:6.90 fps 三回目:7.19 fps
こうなってしまっては意味はありませんが一応。なまじ回転による速度低下が僅かなところがますます切なくなります。
まっとうなメーカーが作った製品ならここまでヒドいことはないとは思いますし、あるいはファームによっても違うのかもしれませんが、ここまでLandscapeとPortraitで描画速度の違いがある端末が世にあるってのは事実なワケで。たまたまePadはLandscapeがPortraitよりも圧倒的に速かったけれど、反対の製品もひょっとしたらあるかもしれないんです。現にIS03は誤差程度ですがPortraitの方が速いし。なのでアプリ側としては、初回起動時にLandscapeとPortraitで描画速度を計測して、あまりにも速度差が大きい場合はそれを考慮して速い方の向きと回転で対処させるのが親切かもしれません。面倒だけど。
尚、ePadの激遅状態を除いてフレームレートが30 fps前後に集中しているのは、ダブルバッファリングの切り替えタイミングと液晶のリフレッシュレートの関係じゃないかと思います。なので、あまり細かい数値の違いは参考にならないかもしれません。
ダウンロード
DrawBitmapOrientationTest apk(PCからのダウンロードは拡張子がzipになる場合がありますので、apkに直してください)
DrawBitmapOrientationTest ソース(Eclipseプロジェクト)


SurfaceViewを構築し、そこに100回画像を貼り付けて表示する時間を計測し、フレームレートを計算します。SurfaceViewはダブルバッファリングをシステムがやってくれるそうで、二枚のプレーンに交互に描いて表示する関係でちらつきますが、今回の趣旨とは関係ないのでそれは放置します。何を言ってるのか分からない人は、最後に今回のアプリのURLを貼っておきますので、自分で試してみてください。
上の写真の左がLandscapeでの結果、右がPortraitでの結果です。余談ですが、IS03はメモリ液晶に表示されたアイコンの向きで、今端末がLandscape状態なのかPortrait状態なのか分かります。それだけではナンですので、端末はLandscapeなのに画像を反時計回りに90度回転させて貼り付けることでPortraitに見せかけるもの(Portrait Fake)と、その反対にPortraitでLandscapeに見せかけるもの(Landscape Fake)も作ってみました。まずはIS03の結果から。それぞれ2回計測しました。
Landscape


一回目:28.91 fps 二回目:29.73 fps
Portrait


一回目:31.97 fps 二回目:33.15 fps
Portrait Fake


一回目:29.07 fps 二回目:29.43 fps
Landscape Fake


一回目:28.69 fps 二回目:33.03 fps
IS03はLandscapeよりもPortraitの方が、ほんの僅かに速いようですが、ほぼ誤差の範囲です。回転させることによる速度低下も、誤差程度しか見受けられません。
これを踏まえた上で、ePadを試してみましょう。こちらは3回ずつ計測しています。
Landscape



一回目:32.08 fps 二回目:32.89 fps 三回目:31.87 fps
意外なことに、IS03のPortraitとほぼ同じ値を出しています。と言いたいところですが、明らかにIS03よりもドロイドの密度が低い。どうやら画面サイズに対して、ドロイドが小さく表示されているようです。IS03の方が解像度は高いのに。うすうすは気が付いていたのですが、どうもAndroidはそのまま画像を貼ったつもりでも、dpiに合せて適当なサイズに変えられてしまうようですね。まあその辺は後々ということで、今回はIS03とePadの直接比較は参考程度にしておいてください。
Portrait



一回目:7.59 fps 二回目:7.72 fps 三回目:7.51 fps
さて問題のPortraitですが…想像以上にヒドいですね。これでUIをスクロールしようとか、カクカクもいいとこです。想像ですがこの遅さは、ビデオチップだかDACだかが本来ピボットに対応してないところを、OS側が無理やりソフトウェア側でVRAMを横にして描画してるんじゃないかと。この端末はPortraitで使っちゃいけないというのがよく分かります。
そこで、縦長の画面として使いたい場合でも、Landscapeのまま回転させて描いてみればいいじゃんってのが次なんですが…
Portrait Fake



一回目:27.20 fps 二回目:31.93 fps 三回目:30.94 fps
Portraitよりも圧倒的に速く、Landscapeと比べても回転による速度低下はほんの僅かで描画できました。一度にたくさん描画したり、もっと大きな画像を描画した場合は多少変わってくるでしょうが、それでもPortraitよりも、Landscapeで回転させた方が速くなるという状況は少なくないのが分かると思います。
Landscape Fake



一回目:6.86 fps 二回目:6.90 fps 三回目:7.19 fps
こうなってしまっては意味はありませんが一応。なまじ回転による速度低下が僅かなところがますます切なくなります。
まっとうなメーカーが作った製品ならここまでヒドいことはないとは思いますし、あるいはファームによっても違うのかもしれませんが、ここまでLandscapeとPortraitで描画速度の違いがある端末が世にあるってのは事実なワケで。たまたまePadはLandscapeがPortraitよりも圧倒的に速かったけれど、反対の製品もひょっとしたらあるかもしれないんです。現にIS03は誤差程度ですがPortraitの方が速いし。なのでアプリ側としては、初回起動時にLandscapeとPortraitで描画速度を計測して、あまりにも速度差が大きい場合はそれを考慮して速い方の向きと回転で対処させるのが親切かもしれません。面倒だけど。
尚、ePadの激遅状態を除いてフレームレートが30 fps前後に集中しているのは、ダブルバッファリングの切り替えタイミングと液晶のリフレッシュレートの関係じゃないかと思います。なので、あまり細かい数値の違いは参考にならないかもしれません。
ダウンロード
DrawBitmapOrientationTest apk(PCからのダウンロードは拡張子がzipになる場合がありますので、apkに直してください)
DrawBitmapOrientationTest ソース(Eclipseプロジェクト)
スポンサーサイト
