Androidがサポートしているテクスチャフォーマット"ETC1"を使って画像を圧縮&Wifi転送する手法について検討しています。
画像データ展開がネック
パフォーマンス向上を図るべくログと睨めっこしていると、早くしたい部分というのが見えてきます。そこを改善すれば早くなるハズですが、実際に改良を加えてみると今度は別な箇所がネックに・・・ということがあります。
ツー ルでは画像データを延々と展開&表示を繰り返す処理があり、処理のほとんどがそれです。なんとか速度を上げたいのでOpenGLを使ってGPUに処理を丸 投げしてしまおうという目論見でした。が、今度はVRAMへの画像転送処理(JPEGの展開が重い)がネックになって逆にスピードダウンしてしまいました(メインメモリとVRAMを 共有している関係もあるのかも)
処理内容
現状の大まかな処理です。
- PCから画像データ(JPEG)を受け取る
- 受け取った画像データをメインメモリに展開
- 展開した画像をテクスチャとしてVRAMへ転送
- 画面の表示
とっても迂遠な感じです。この中で2,3が特に処理時間を要しています。
JPEGなんかで送らずに生(そのままメモリに展開できるような)データで受け取れば早くなるかとも思いましたが、結果としてはネットワーク帯域が一杯一杯になってしまい頓挫。
次なる目論見
圧縮テクスチャというものがありました。上記3ではVRAMへでかい生データを転送していますが、ここを圧縮した状態で送ってやることが出来るそうです(展開はGPUがやってくれる)。
ということは、PC側で画像を圧縮テクスチャとして用意することが出来れば処理2,3を大幅に短縮出来そうです。
リアルタイムで作れるかはこれからですが、作成ツールがあったので試してみました。
- ARM Mali Texture Compression Tool
http://malideveloper.arm.com/develop-for-mali/mali-gpu-texture-compression-tool/
サンプル画像で試したところ、759kbyte(JPEG)が385kbyteになっていました。ぱっと見では劣化も気になりません。
ただ、ちょっと処理時間がかかってたのが心配ですが・・・
テストプログラムを作ってAndroid上で試した感じでは、表示は問題なさそうでした。