2011年11月20日日曜日

画像を画面サイズに合わせる(縮尺・縮小する)の続き【android】【画像表示】【エラー】

以前の投稿の続きです。↓
⇒画像を画面サイズに合わせる(縮尺・縮小する)【android】【画像表示】【エラー】

以前、紹介した画像を画面サイズに合わせる方法ですが、いざ、自分で使ってみると
GC(ガーベッジコレクション)が画像毎に発生して、処理が非常に遅いという問題
が発生しました。
※画像表示処理もそこそこに遅いのに、GCがさらに悪化させているようでした。

なんとかGCの発生を抑制したくいろいろ調べた結果、Bitmap作成処理を下記のように
書き換えることで、GCの発生を抑え、処理時間を短くすることができました。

以前の方法では、画像をそのままBitmapに読み込んでから縮尺していたようで、
メモリにごみができやすいという問題があったようです。
今回は画像のサイズをあらかじめ読み込んでおき、画像の読み込みのタイミングで
縮尺しているので、メモリを無駄なく使用することができます。

あと、不本意ではあるのですが、androidでは短命なオブジェクトや変数を生成しない
ようにしたほうがパフォーマンスがあがるという情報を得て、できるだけクラス変数
で、変数を宣言するようにしています。
※ほかにも下記のようなパフォーマンス対策がありました。
  ・setterやgetterは使用しない。
  ・オブジェクトを作成しない(コードはベタ書きすべき)。
  ・処理が遅くなっても問題ない箇所でGCするようにする。
  ・定数はfinalで宣言する。

ただし、そのままこの情報を受け取ってコーディングをすると、非常に見づらい
コードとなってしまいそうなので何か対策を立てる必要がありそうです。


    //setBitmap変数
Bitmap bmImage;
int zoomWidth;
int zoomHeight;

/**
* ディレクトリリストに表示するBitmapを設定する。
* @param File file(設定するBitmapファイル)
* @return Bitmap bmImage(設定されたBitmap)
* @exception なし
*/

public Bitmap setBitmap(File file){
// ビットマップ作成オブジェクトの設定
BitmapFactory.Options bmfOptions = new BitmapFactory.Options();
// RGBでそれぞれ 5/6/5 ビットの色を使用(メモリ対策)
bmfOptions.inPreferredConfig = Config.RGB_565;
// アプリケーション内でのピクセル密度を設定
bmfOptions.inScreenDensity = DisplayMetrics.DENSITY_LOW;
// 画像の大きさだけ取得
bmfOptions.inJustDecodeBounds = true;
bmImage = BitmapFactory.decodeFile(file.getPath(),bmfOptions);

// 画面のサイズの1/4で画像を縮尺するよう、縮尺率を設定
if (displayMetrics != null) {
zoomWidth = (int)Math.floor(bmfOptions.outWidth / (displayMetrics.widthPixels / REDUCTION_SIZE));
zoomHeight = (int)Math.floor(bmfOptions.outHeight / (displayMetrics.heightPixels / REDUCTION_SIZE));
bmfOptions.inSampleSize = Math.max(zoomWidth, zoomHeight);
}
// 画像そのものを設定された縮尺率で取得
bmfOptions.inJustDecodeBounds = false;
bmImage = BitmapFactory.decodeFile(file.getPath(),bmfOptions);

return bmImage;
}
}

0 件のコメント:

コメントを投稿