3

これは私の最後の質問へのちょっとしたフォローアップです:Canvasの描画が遅すぎます

より速く画像を描くことができるようになったので、私が直面している問題は、画像の実際の読み込みに非常に時間がかかることです。

私が取り組んでいるアプリでは、ユーザーはビデオをリアルタイムで表示しているかのように、ビデオフレーム(jpeg)を連続して再生できます。私はBitmapFactory.decodeFile()ビットマップに各jpegをロードするために使用しています。約240枚の画像があるため、一度にすべての画像を読み込むことができず、ヒープスペースをすべて使い果たしてしまいます。私が行っているのは、各画像の表示にかかる時間を短縮するために、個別のスレッドを介して一度に最大6つを配列にプリロードすることです。

残念ながら、画像の読み込みには50〜90ミリ秒かかり、42ミリ秒ごとに画像を表示する必要があります。おそらく画像をロードするより速い方法はありますか?

明確にするために、これらの画像はSDカード上のフォルダーにあり、すべて720x480jpegです。メモリ使用量を削減するために、その半分のサイズでサンプリングしています。

4

2 に答える 2

1

私はこれを当初の想定とはかなり異なる方法で行うことになりました。それにはかなりのことがありましたが、これが私の目標をどのように達成したかの要点です。

  1. すべての画像はSDカードに保存され、1つのファイルに書き込まれます(各画像はファイル内でXバイトを占めます)
  2. ネイティブコードを使用して、画像ファイルの読み取りと書き込みを行います
  3. 画像をリクエストするときは、リスト内の画像のインデックスとビットマップオブジェクト(RGB_565)をJNIラッパーを使用してネイティブコードに渡します。
  4. ネイティブコードはビットマップサーフェスをロックし、ピクセルデータを(uint8_t **として)ビットマップに直接書き込み、ロックを解除します
  5. 画像が画面にレンダリングされます

このようにすることで、一度に1つの画像をメモリに保存するだけで済み、ガベージコレクションをバイパスできました(ビットマップは1回だけ作成され、ネイティブに再入力されたため)。他の誰かがこの戦略が役立つと思うかもしれないことを願っています。

于 2011-10-11T01:53:01.530 に答える
0

このチュートリアルhttp://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/のすべての方法をすでに試し、最速を選択したと思います。サイズ変更を微調整すると、読み込み時間を短縮できる可能性があります。

もちろん、画像のサイズをまったく変更する必要がない場合は、何よりも優れています。画像を完全に制御できる場合は、画像をスプライトとしてパックしてみることができます。記事http://www.droidnova.com/2d-sprite-animation-in-android,471.htmlを参照してください。

于 2011-06-29T20:25:49.857 に答える