2012/05/18

Android:ピクセルフォーマットを意識した高速化テクニック

画像描画でよく取り上げられるピクセルフォーマット。
ピクセルフォーマットはピクセル色の表現形式です。
http://developer.android.com/reference/android/graphics/PixelFormat.html

AndroidでもWindowやBitmapなど描画関係のクラスでピクセルフォーマットを指定できます。
http://developer.android.com/reference/android/view/Window.html#setFormat(int)

アプリパフォーマンスとピクセルフォーマットにどのような関係があるのか?
端的に言えば、下記のような関係にあります。
  • 透過効果を... ⇒ 使用しないフォーマット > 使用するフォーマット
  • ピクセル毎の色情報が... ⇒ 少ないフォーマット > 多いフォーマット

よりシンプルなピクセルフォーマットの方が早いのです。
また、メモリ効率の面で有利なフォーマットもあります。

代表的なピクセルフォーマットについてもう少し深く追っていきます。
ピクセルフォーマットには下記の種類が指定できます(代表的なものを抜粋)
  • RGB_565
  • RGBX_8888
  • RGBA_8888

R(Red)G(Green)B(Blue)A(Alpha)によるピクセルフォーマット指定です。
例えば、写真等の画像はRGB_888で十分表現可能です。
RGB_888はR,G,B各色8bitの情報量で色を表現するフォーマットです。
もちろん、RGB_888以外のフォーマットも存在します。

例えば「透明度を指定できるフォーマット」や、「色数は減るがより軽量であるフォーマ
ット」、「GPUアーキテクチャを考慮したフォーマット」等様々です。
それぞれのフォーマットの長所・短所を知り、最も力を発揮できるシーンで利用すればア
プリのパフォーマンスを向上することができるでしょう。

●RGB_565
画像は粗くなりますが、色情報量を減らすことでメモリ効率の向上が期待できます。
緑が6bitで赤青が5bitずつである理由は、人間の視覚が緑に対して敏感なためです。

●RGBX_8888
24bitトゥルーカラー(RGB)に付加bit(X:8bit)を加えているため、描画速度の向上が期待
できます。
付加bitについて触れておくと、
グラフィクスアクセラレータチップのメモリ接続バスは128bitが主流です。
しかし、RGB_888(24bit)の場合、接続バスへの色情報転送時に"余り"が出てしまいます。
(128 / 24 = 5…8)
そこで、RGB_888に8bitを付加することで転送効率が増し、描画速度が向上します。
ただし、1ピクセルあたりの色情報が増えるためメモリ使用量が増える短所があります。

●RGBA_8888
24bitトゥルーカラー(RGB)にαチャネル領域の8bitを加えたフォーマットです。
これにより、半透明な画像を表示することが可能になります。


高品質な画像を表示する場合にRGB_565は不向きです。
しかし、アイコン等の簡単な画像を表示する場合はRGB_565の品質で十分でしょう。

品質は確保しつつ、高速描画を実現したい場合はRGBX_8888の使用を検討します。
ただし、メモリ使用量が増加する傾向にあるので注意が必要です。

透明度の表現が必要な場合はαチャネル領域を持つフォーマット(RGBA_8888等)を指定す
る必要があります。

以上です。