2012-01-12 12 views
2

小さなビットマップ(100+、サイズ約40x40)がかなりあります。それぞれ不透明で透明な部分がいくつかあります。これらの分野を尊重して描くアルファチャンネルを使用したビットマップ描画:

ビットマップはARGB形式で、888(rgb)と256ビットアルファチャンネル(PNG形式のような標準)です。私はそれらを描画するために見つけ

のみ(作業)の方法は、次のようなアプローチである。

  1. ビットマップ(ARGB_8888)
  2. を作成した生データ
  3. でビットマップを埋めるからアルファ層を抽出元のビットマップ
  4. に基づいて、ビットマップ

  5. BitmapShader(RGB_565)を作成するには、作成したシェーダを使用して、ビットマップ用の塗料を作成し

  6. 次に、特別なBitmapShaderを使用してペイントを使用してアルファマスクをペイントします。

    void initializeTile(int t){ 
    // Allocate the bitmap: 
    Bitmap original_data = Bitmap.createBitmap(tile_w, tile_h, Bitmap.Config.ARGB_8888); 
    // Fill with raw data (this is actually native C++ code): 
    populateBitmap(original_data); 
    // Get the alpha mask: 
    tile_mask[ t ] = original_data.extractAlpha(); 
    // Create the bitmap shader: 
    tile_data = original_data.copy(Bitmap.Config.RGB_565, false); 
    // Create the shader: 
    BitmapShader shader = new BitmapShader(tile_data, CLAMP, CLAMP); 
    
    // Create the paint: 
    tile_paint[ t ] = new Paint(); 
    tile_paint[ t ].setDither(true); 
    tile_paint[ t ].setAntiAlias(true); 
    tile_paint[ t ].setFilterBitmap(true); 
    tile_paint[ t ].setShader(shader); 
    } 
    

    、ペイントコードは最も簡単なことができ、メインドローループにあります:

初期化コードはもちろん、一度だけ実行され

void paintTile(t){ 
canvas.drawBitmap(tile_mask[ t ], tile_x[ t], tile_y[ t], tile_paint[ t]); 
} 

今、Ideos(Android 2.2)のような携帯電話では滑らかで上手く走りますが、トップエンドのSamsung Galaxy SII(Android 2.3)のような他の携帯電話では、それは嘘つきで遅いです。これは私にはあまり意味がありません...

このアプローチについてどう思いますか?同じ結果を達成するためのより良い、より速い、方法がありますか?

そして、近代的で高速なハードウェアではなぜそれほど遅いと思いますか?それを改善する方法はありますか?

答えて

4

[OK]をいくつかの作業の後、私はよりよい解決策を見つけました。私は自分の質問に答えることができないので、私より多くを知っていればやってください。

しかし、より多くの人々がこれを必要とする場合は、新しいソリューションを投稿していますが、もう少し複雑ですがはるかに高速です。重要なアイデアは、シェーダのアプローチを初期化中にのみ使用し、塗りには使用しないことです。

これを行うには、シェーダの手法を使用して透明な領域をすべてクリアした新しいビットマップを作成し、描画コードにシェーダなしのビットマップを描画します。

void initializeTile(int t){ 
// Allocate the bitmap: 
Bitmap original_data = Bitmap.createBitmap(tile_w, tile_h, Bitmap.Config.ARGB_8888); 
// Fill with raw data (this is actually native C++ code): 
populateBitmap(original_data); 

// Now make a new bitmap to be clipped: 
Bitmap clipped_data = Bitmap.createBitmap(tile_w, tile_h, Bitmap.Config.ARGB_8888); 
Canvas canvas = new Canvas(clipped_data); 
Paint clip_paint = new Paint(); 
clip_paint.setDither(true); 
clip_paint.setAntiAlias(true); 
clip_paint.setFilterBitmap(true); 
clip_paint.setShader(new BitmapShader(original_data, CLAMP, CLAMP)); 
// Paint the clipped bitmap: 
canvas.drawBitmap(tile_mask[ t ], 0, 0, clip_paint); 
//Use the clipped bitmap as original bitmap: 
tile_data[ t ] = clipped_data; 
} 

も描画コード:

void paintTile(t){ 
canvas.drawBitmap(tile_data[ t ], tile_x[ t], tile_y[ t], null); 
} 

全体的には、これははるかに高速です。 まだ、Androidが私のアルファチャンネルのビットマップを適切にペイントしない理由はわかりません。

関連する問題