2011-09-29 12 views
8

私はJavaで書かれたエミュレータをアンドロイドに移植しようとしています。物事は順調に進んでいますが、ほとんどのコードをマイナーチェンジして移植することはできましたが、エミュレーションの仕方によってピクセルレベルでイメージをレンダリングする必要があります。アンドロイド高速ピクセルアクセスと操作

私が使用するデスクトップJava用として、私は

は現在、これがためにどのような私のエミュレータです(オブジェクトの創作を最小限に抑える)ピクセルバッファへの参照を取得し、その場でそれを更新することができ

int[] pixelsA = ((DataBufferInt) src.getRaster().getDataBuffer()).getData(); 

アンドロイドは、すべてのフレーム

@Override 
public void onDraw(Canvas canvas) 
{ 
    buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565); 
    canvas.drawBitmap(buffer, 0, 0, null); 

} 

ためpixelsAは、配列intでない[]、pixelsAは、すべての色の情報が含まれているので、すべてのフレームには、ビットマップオブジェクトを作成する必要があります私はかなり高価で遅いと信じて

buffer = Bitmap.createBitmap(pixelsA, 256, 192, Bitmap.Config.RGB_565); 

私は非常に高価であると信じています。

キャンバスで効率的にピクセルを描画する方法はありますか?

+0

真、createBitmapは、遅いですあなたのケースでは、メモリのコピー、さらにはピクセル形式の変換です! –

答えて

0

毎回ビットマップを再作成しないでください。

Bitmap buffer = null; 
@Override 
public void onDraw(Canvas canvas) 
{ 
    if(buffer == null) buffer = Bitmap.createBitmap(256, 192, Bitmap.Config.RGB_565); 
    buffer.copyPixelsFromBuffer(pixelsA); 
    canvas.drawBitmap(buffer, 0, 0, null); 
} 

EDIT:ピクセルバッファーを更新する必要があります。ビットマップはそれが起こるためには変更可能でなければなりません。

+0

これは動作しません。ビットマップはcreateBitmap内の独自のピクセルバッファを初期化し、呼び出さずにBitmapのピクセルを更新しません。 –

10

一つは非常に低レベルの方法が、(ネイティブコードで)私にとっては正常に動作:

は、あなたの目に見える画面と同じ大きBitmapオブジェクトを作成します。 また、Viewオブジェクトを作成し、onDrawメソッドを実装します。

ネイティブコードでは、libjnigraphics.soネイティブライブラリの参照機能AndroidBitmap_lockPixelsAndroidBitmap_unlockPixelsを読み込みます。 これらの関数は、bitmap.hのAndroidソースで定義されています。

ビットマップでロック/ロック解除を呼び出し、生のピクセルにアドレスを受け取ります。 RGB形式のピクセルをそれに応じて解釈する必要があります(16ビット565または32ビット8888)。

ビットマップの内容を変更した後、これを画面に表示します。 ViewView.invalidate()と電話してください。 onDrawには、ビットマップをCanvasにblitします。

この方法は非常に低レベルで、Androidの実際の実装に依存しますが、非常に高速ですが、60fpsの問題は発生しません。

bitmap.hはプラットフォームバージョン8以降、Android NDKの一部です。したがって、これはAndroid 2.2から正式な方法です。

4

drawBitmap methodを使用すると、毎回ビットマップを作成しないようにすることも、最後の手段としてピクセルを1つずつdrawPointで描画することもできます。

+0

私は、そのパラメータとしてint []をとるdrawBitmapメソッドを試しました。これは、ビットマップオブジェクトの作成よりも優れたパフォーマンス向上をもたらします。これは、ネイティブコードに頼らずに許容できるパフォーマンスを達成するための唯一の方法だと思います。 – afro100

+1

これはうまく機能していることを知っています。あなたが言うように、ネイティブに行くほど速いものはありませんが、もっと複雑です。 –

0

pixelsAはすでに(私は色を含む約あなたの文から推測するであろうものである)の画素配列であるならば、あなただけで変換せずに直接、それらをレンダリングすることができます。

canvas.drawBitmap(pixelsA, 0, 256, 0, 0, 256, 192, false, null); 
関連する問題