« Android での動画再生 | メイン | SD インストールに対応する時の注意点 »

2012年03月15日

Android:: getPixels と copyPixelsToBuffer

    

Bitmap.getPixels でピクセル情報を取得し、Bitmap.setPixels で書き戻すのと、Bitmap.copyPixelsToBuffer でピクセル情報を取得し、Bitmap.copyPixelsFromBuffer で書き戻すのはどちらが早いか計測した。
Xperia arc で 800x600 32bitカラーのBitmap で計測すると、
1. Bitmap.getPixels/setPixels は、33msec 程度。
2. Bitmap.copyPixelsToBuffer/copyPixelsFromBuffer (array) は、6~7msec程度。
3. Bitmap.copyPixelsToBuffer/copyPixelsFromBuffer (direct) は、11~29msec程度。
array は、int[] pixels = new int[w*h]; IntBuffer buff = IntBuffer.wrap(pixels); としたもの。
direct は、ByteBuffer b = ByteBuffer.allocateDirect(w*h*4); IntBuffer buff = b.asIntBuffer(); としたもの。
array を wrap した、IntBuffer で、copyPixelsToBuffer を使うのが一番早い様子。
ByteBuffer.allocate を使ってもたぶん同じ結果になると思われる。

取得後、各ピクセルにグレースケール化処理を行い、書き戻した場合はそれぞれ以下のようになった。
1. 56~59msec ( 343~674msec )
2. 29~34msec ( 280~321msec )
3. 1107~1248msec ( 1718~2143msec )
括弧内の数値は初回で、それ以外は2回目以降の数値。
JIT 等の効果により、2回目以降は速度が上がっていると思われる。
3 が異様に遅いのは、IntBuffer.get/put によってピクセル値の取得と書き戻しを行っているせいだと思われる。
他は、配列で処理している。

array を wrap した Buffer で取得設定し、array で処理するのが一番か。

Canvas.drawBitmap(int[] colors, int offset, int stride, int x, int y, int width, int height, boolean hasAlpha, Paint paint) を使って、書き戻した場合はどうかも計測した。
1. Bitmap.copyPixelsFromBuffer 3 ~ 4msec
2. Canvas.drawBitmap 31 ~ 33msec
この場合も Bitmap.copyPixelsFromBuffer が大幅に早い様子。

自前でピクセル処理する場合、Bitmap.copyPixelsToBuffer/copyPixelsFromBuffer (array) を使うのが良さそう。



投稿者 Takenori : 2012年03月15日 00:59




comments powered by Disqus
Total : Today : Yesterday : なかのひと