2012-03-12 3 views
2

多くのビットマップオブジェクトを生成するアプリケーションがあります。一度ビットマップを作成すると、残りのビットマップはすべて同じサイズになります。ビットマップをロードする最速の方法、一度作成したビットマップを再利用する

現在、携帯電話で約50〜80ミリ秒で新しいビットマップをロード/作成することができます。しかし、これらの作成の速いペースのために、私は一定のGCを打つことになります。

私は同じビットマップオブジェクトを再利用したいと思いますが、sdkを通じてこれを行う方法がわかりません。

私はlibjpegをコンパイルし、NDKを介して画像をロードしてビットマップを再利用しましたが、ロード速度は約200ミリ秒に低下しましたが、これは遅すぎます。 私の目の前にコードを投稿します。

質問:

GCを避けるために、私のビットマップオブジェクトを再利用する方法はありますか? NDKを使用して画像をより高速に読み込む方法はありますか? OSがビットマップをロードする方法にフックすることは可能ですか?私はlibjpegTurboについて知っていますが、私は現在コンパイルすることができません(別のトピックは別の日です)。

これを行う最善の方法については、他の考えがあります。

答えて

1

ハッシュマップを使用してビットマップを保存してみませんか?次に、ビットマップをロードするとき、最初にハッシュマップにそのビットマップがあるかどうかを確認し、もしあればそれを再利用することができます。ハッシュマップにない場合は、通常の方法で保存し、ハッシュマップに挿入します。

+0

私は約20ビットマップを作成していますので、それらをすべてメモリに保存することはできません。私は実際に新しいビットマップを引っ張っているキューをポピュレートする背景スレッドを持っています。大きな問題は新しいビットマップオブジェクトを作成するのではなく、私のバックグラウンドスレッドで、ビットマップのプールから抜き出して再利用したいので、GCをあまり必要としません。 – broschb

+0

@broschbあなたがそれらをメモリに保持できない場合、どのようにそれらを再利用できますか?あなたはそれが意味をなさないことを実感していますか?メモリの制限がある場合は、ハッシュマップとキューを使用してイメージキャッシュを実装し、その後、ロードされたビットマップの数に一定の限界があると、古いビットマップをキューから削除し、GCにヒントを与えます彼らは記憶からクリアする必要があります。ハッシュマップは、ビットマップが現在キューにあるかどうか、およびその位置を識別するために使用されます。 – onit

+0

ビットマップのピクセルデータを、別のビットマップからの新しいピクセルデータで変更することによって、ビットマップを再利用することができます。 @Samuelsの反応を見て、これは私が考えているトラックに沿っていると思います。 – broschb

1

スワップアウトする必要があるピクセルデータを含むIntBufferを使用することをお勧めします。次に、必要なサイズのビットマップを1つ作成し、ピクセルをスワップアウトする必要がある場合は、bitmap.copyPixelsFromBuffer()を使用します。ピクセルデータを変更する必要があるたびに、ビットマップメモリ​​の割り当て/割り当て解除よりもずっと速くなると思います。クイックリトリーブのためにバッファをメモリに保持したい場合は、バッファをハッシュマップに保持することをお勧めします。

オプションで、intの配列でsetPixels()を使用できます。 copyPixelsFromBuffer()の便利な点は、ピクセル変換は行われず、オプションも少なくなるため、少し速いかもしれないということです。

+0

私はintバッファの考え方が好きですが、ここで私が目にする唯一の重要な利点はメモリ空間かもしれないということです。最も速い方法は、オブジェクトをメモリ内に保持することです。この場合、intバッファがビットマップオブジェクトよりも大幅に小さい場合にのみ、これは大幅に改善されます。ビットマップが比較的小さい場合を除き、私は疑問を持っています。 – onit

+0

ピクセルデータはどこから来ていますか?ある点ではint型の配列でなければなりません。したがって、毎回ビットマップを割り当てる場合は、int配列用のメモリとビットマップ用のメモリがあります。あなたがint配列を使っていると仮定すると、そのオブジェクトはガベージコレクションされる必要があります。その後、ビットマップで作業が完了したら、ガベージコレクションも必要になります。それはガベージコレクションが必要な2つの大きなオブジェクトです。ビットマップを1つしか使用しない場合、不要なオブジェクトを収集する必要はありません。ビットマップGCにはJNI呼び出しも含まれているため、時間がかかります。 – Samuel

+0

ビットマップをメモリに再利用している場合、メモリにキャッシュできない膨大な量のイメージがない限り、GCはもはや大きな問題にはなりません(私は個人的に新しい携帯電話のメモリに数百ビットマップを保存しています)。ビットマップが非常に小さい場合を除いて、ビットマップで使用されるメモリの少なくとも95%が実際の基底のint配列であると思います。ビットマップをメモリにキャッシュできれば(これは最大のパフォーマンス向上になるでしょう)、これが大きなパフォーマンス向上になるとは思えません。 Bitmapsを常にリサイクルする必要がある場合は、改善することに同意します。 – onit

関連する問題