2011-08-09 11 views
10

私は一晩中アンドロイドのパフォーマンスで戦ってきましたが、おそらく私が扱ってきた問題を解決しましたが、私はまだ非常に混乱しています。これらの2つのサンプルのタイミングの違いを考慮してください。Android drawBitmap 5倍のパフォーマンスの違い

描画可能ビットマップの最初のサンプル負荷と第二のサンプルは、元のブランクイメージをコピーせずに、新しいビットマップを作成

Bitmap cacheBitmap; 
Canvas cacheCanvas; 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    if (cacheBitmap != null) { 
     cacheBitmap.recycle(); 
    } 
    Resources res = getContext().getResources(); 
    Bitmap blankImage = BitmapFactory.decodeResource(res, R.drawable.blank); 

    /* copy existing bitmap */ 
    cacheBitmap = Bitmap.createScaledBitmap(blankImage, w, h, false); 
    /* copy existing bitmap */ 

    cacheCanvas = new Canvas(); 
    cacheCanvas.setBitmap(cacheBitmap); 
    cacheCanvas.drawRGB(255, 255, 255); 
} 
public void onDraw(Canvas canvas) { 
    canvas.drawBitmap(cacheBitmap, 0, 0, null); // draws in 7-8 ms 
} 

その変更可能なコピーを作成します。

Bitmap cacheBitmap; 
Canvas cacheCanvas; 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    if (cacheBitmap != null) { 
     cacheBitmap.recycle(); 
    } 
    Resources res = getContext().getResources(); 
    Bitmap blankImage = BitmapFactory.decodeResource(res, R.drawable.blank); 

    /* create fresh bitmap */ 
    cacheBitmap = Bitmap.createBitmap(w, h, blankImage.getConfig()); 
    /* create fresh bitmap */ 

    cacheCanvas = new Canvas(); 
    cacheCanvas.setBitmap(cacheBitmap); 
    cacheCanvas.drawRGB(255, 255, 255); 
} 
public void onDraw(Canvas canvas) { 
    canvas.drawBitmap(cacheBitmap, 0, 0, null); // draws in 40 ms 
} 

第1のサンプルは、第2のサンプルより5~6倍速く描画されますが、これはなぜですか?私はブランクイメージに依存しない何らかの方法でこのコードを書くことができるようにしたいと思いますが、私が何をしても、最初にコピーできるようにすることなく低速のビットマップ描画で終わります。

答えて

3

ビットマップのフォーマットを確認してください。古いバージョンのAndroidでは、特定の関数を使用してビットマップを作成するときに、アルファなしのビットマップには常に565、アルファ付きのビットマップには8888を使用するバグ(機能)がありました。

どういうわけか、あるバージョンでは8888が使用され、もう1つでは565が使用され、スピードを向上させると言いたいと思います。

getConfigを使用して両方のビットマップを調べます。

+0

事は、私が cacheBitmap = Bitmap.createBitmap(Bitmap.Config.RGB_565、w、h)を呼び出すときに、ある私のドローコールが30ミリ秒を取ると、私は cacheBitmap = Bitmap.createBitmap(W、H、ビットマップを使用する場合。 Config.ARGB_8888)私のドローコールは40ミリ秒かかるので、それだけではありません。 – seanalltogether

+7

それは機能でした:) –

+0

@Romain:私は知っています:)私はそのバグを綿密に追跡しました。私がGoogle+であなたをフォローして以来、あなたはAndroidについて話していると聞いて面白いですが、一日中世界中を旅して写真を撮っているような感じです:) – EboMike

1

createScaledBitmap()は実際に画面に必要な比率で正確に新しいビットマップを作成し、内部的に1:1のピクセル描画を行い、おそらくより速い描画ルーチンを可能にすることはできませんでした。ビットマップを描画するための呼び出しは、元のリソース(おそらく多くの余分なピクセル)に関するすべての情報を含むビットマップと、内部ビットマップのピクセルと描画されるキャンバスの内部スケーリングの結果になります。

関連する問題