3

共有メモリ バッファ上のネイティブ コードでグラフィカル操作を処理する Android アプリケーションに取り組んでいます。JNI を使用して Java からネイティブ コードを呼び出す関数を作成しました。ネイティブ コードは JNI API を使用してネイティブ コードから Java を呼び出します。ピクセルの大きな配列をコピーするとパフォーマンスに大きな影響を与えるため、可能な限り避ける必要があります。

Bitmap クラスの Android ドキュメントでは、Bitmap 内部バッファーにピクセルをコピーする 2 つの方法について説明しています: http://developer.android.com/reference/android/graphics/Bitmap.html

setPixels(int[] ピクセル、int オフセット、int ストライド、int x、int y、int 幅、int 高さ) ビットマップのピクセルを配列の色に置き換えます。

copyPixelsFromBuffer(Buffer src) 現在の位置から始まるピクセルをバッファからコピーし、ビットマップのピクセルを上書きします。

API ドキュメントの問題は、これらの関数を使用するときに舞台裏で何が起こっているかについて非常に曖昧であることです。ただし、copyPixelsFromBuffer() は、元のピクセルがターゲット ピクセル フォーマットであっても常にその変換を行う setPixels() とは対照的に、内部カラー フォーマット変換なしでピクセルを直接コピーすることがどこかに言及されています。明らかに、バッファ内のピクセルは既に適切な形式になっているため、これは私が望んでいるものではありません。

現在、 copyPixelsFromBuffer() はその変換を行わないため非常に見栄えがしますが、ドキュメントにはピクセルをバッファーからターゲットビットマップの特定のオフセットにコピーする方法については記載されていません。おっと、これは非常に重要なことです。なぜなら、毎回バッファー全体をコピーするのではなく、その領域だけをコピーしたいからです。はい、ドキュメントには、ソース バッファーの現在の位置からコピーすると書かれていますが、コピー先バッファーについては何も述べられていません。SetPixels() は不要な変換を行いますが、変換先バッファーでオフセットを指定できるようにします。

だから、私は間で立ち往生しています:

ピクセル変換を犠牲にして必要な領域のみをコピーする

また

毎回バッファ全体をコピーするという犠牲を払ってピクセル変換を回避する

アイデアを得るために、(300,300) から (400,400) までの無効な領域を持つ 1024x768 画面を表すバッファーがあるとします。

更新が必要な領域のみをコピーすると、100*100 ピクセルをコピーして変換するか、1024*768 ピクセルを変換せずにコピーできます。100x100 の無効な領域は小さく、特定のケースのみで、ほとんどの無効な領域はバッファのより大きな部分を占めます。どちらの方法も、パフォーマンスに非常に悪影響を及ぼします。

強制的なピクセル変換を行わずに、バッファーからターゲット バッファーの特定のオフセットにピクセルをコピーする方法を知っている人はいますか? それは両方の世界で最高のものであり、なぜそれが利用できないように見えるのかわかりません.

助けてくれてどうもありがとう

4

1 に答える 1

0

私の推測では、ソースと宛先の両方にソースオフセットを自動的に使用するだけなので、関数は宛先オフセットを取らない可能性があります。ぜひ試してみてください。

-n

于 2010-11-05T16:36:47.887 に答える