2012년 6월 24일 일요일

getview() 개선점을 찾아 보다.

opensrc image viewer는 마무리 하려고 한다.
공부용이기도 하고 다른 분들께 base source를 제공하는 뷰어인데
만든지 일년이 지났고 그 동안 업뎃이 전혀 없다가 최근에 내가 필요한거 몇개 넣었다.
걍 클릭하면 슉슉 넘어가는거랑 누르자 마자 지워지는 delete mode
따로 폴더 찾아 안 들어가도 다 땡겨오는 uri(안드로이드에서 제공)를 쓰기 때문에
심심할 때 사진 볼 때는 좋다.

마무리 하기 전에 두가지 기능을 넣어야 하는데 하나는 스크롤이 늦게 되는거랑.
빽키 눌렀을 때 나오면 위치 저장이 안되는 거다.

캐쉬 기능을 쓰고 그림을 보기 전에 현재 위치를 저장하는 기능이 추가 되어야 할 것 같은데
만만치 않아 보인다. :)


일단 시간 투자를 해보자.

우선 문제가 되는 부분이 다음이라고 생각을 했다.

public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) {
imageView = new ImageView(this.imageViewer.mContext);
imageView.setLayoutParams(new GridView.LayoutParams(185, 185));
imageView.setAdjustViewBounds(true);
imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
imageView.setPadding(2, 2, 2, 2); // Padding setting
} else {
imageView = (ImageView) convertView;
}
BitmapFactory.Options bo = new BitmapFactory.Options();
bo.inSampleSize = 4; // very very important.
Log.i("DEbF", "in " + String.valueOf(System.currentTimeMillis()));
Bitmap BM = BitmapFactory.decodeFile(thumbsDataList.get(position),
bo);
Matrix mat = new Matrix();
mat.postScale(1, 1);
try {
BM = Bitmap.createBitmap(BM, 0, 0, BM.getWidth(),
BM.getHeight(), mat, true); // useless
imageView.setImageBitmap(BM);
} catch (Exception e) {
// TODO: handle exception THIS is POINT occured Exception of
// NULL~
Log.e(TAG, "BM EXCEPTION " + e);
}
return imageView;
}

그림 불러올 때 용량이 문제니까 해당부분만 바꾸어 보자고 했다.

256으로 해도 역시 끊긴다.

현상은 스크롤시 다음 그림이 없으면 스크롤 하는 순간에 다음 그림을 가져오는 것이고

그 때 속도가 느린 것이 문제였다.

BitmapFactory.Options bfo = new BitmapFactory.Options();

// TODO:SPEED UP
bfo.inJustDecodeBounds = true;
Bitmap BM = BitmapFactory.decodeFile(thumbsDataList.get(position),
bfo);
       Display currentDisplay = getWindowManager().getDefaultDisplay();
       @SuppressWarnings("deprecation")
int dw = currentDisplay.getWidth();
       @SuppressWarnings("deprecation")
int dh = currentDisplay.getHeight();

       int heightRatio = (int)Math.ceil(bfo.outHeight/(float)dh); //floor, round...
       int widthRatio = (int)Math.ceil(bfo.outWidth/(float)dw);

       Log.i(TAG, "outHeight" + bfo.outHeight );
       Log.i(TAG, "outWidth" + bfo.outWidth );

       if(heightRatio > 1 && widthRatio > 1)
       {
        if(heightRatio > widthRatio)
        {
        bfo.inSampleSize = heightRatio+4;
        }
        else
        {
        bfo.inSampleSize = widthRatio+4;
        }
       }

       Log.i(TAG, "in Sample size = " + bfo.inSampleSize);

       //IN SAMPLE SIZE has some error. over about 5000, sample size not working properly.
       if(bfo.outHeight < 200 && bfo.outWidth < 200) bfo.inSampleSize = 0;

       bfo.inJustDecodeBounds = false;

계산하는 부분을 넣어 줘 봤다. 붉은 색 두 부분은 실재로 이미지를 가져올 것인가, 정보만 들고 올 것인가 옵션을 키고 끄는 부분.

이미지 들고 오기 전에 화면 크기랑 비례해서 sample size를 얼마나 할 것인지 계산하는 부분이다. 일단 1/4은 줄이고 시작한다. 이미지가 가로, 세로 200보다 작으면 걍 실재 이미지를 프로세싱하는데 혹시나 이미지가 너무 샘플링 되어서
 화면이 흐려질까봐.


이렇게 해도 여전히 문제는 존재한다.

아 결국...

따로 썸네일을 만들어야 하는 상황인가 ㅠㅠ



06-24 12:33:41.423: I/Bicture(1480): ++++++++++++++++++++++GET_VIEW+++++++++++++++++++++
06-24 12:33:41.427: I/Bicture(1480): outHeight1232
06-24 12:33:41.427: I/Bicture(1480): outWidth2048
06-24 12:33:41.427: I/Bicture(1480): in Sample size = 8
06-24 12:33:41.427: I/DEbF(1480): in 1340508821433
06-24 12:33:41.513: I/Bicture(1480): ++++++++++++++++++++++GET_VIEW+++++++++++++++++++++
06-24 12:33:41.517: I/Bicture(1480): outHeight1232
06-24 12:33:41.517: I/Bicture(1480): outWidth2048
06-24 12:33:41.517: I/Bicture(1480): in Sample size = 8
06-24 12:33:41.517: I/DEbF(1480): in 1340508821522
06-24 12:33:41.595: I/Bicture(1480): ++++++++++++++++++++++GET_VIEW+++++++++++++++++++++
06-24 12:33:41.603: I/Bicture(1480): outHeight1232
06-24 12:33:41.603: I/Bicture(1480): outWidth2048
06-24 12:33:41.603: I/Bicture(1480): in Sample size = 8
06-24 12:33:41.603: I/DEbF(1480): in 1340508821606

로그를 보면 스크롤시에 getView 3번이 불린다.
분명히 getView다. getView 성능 개선을 필요하다.

이러다가 gridView 부분을 다시 구현해야 하는건 아니겠지.

ㅋㅋ


쓰레드 이용하고 스크롤시 구동되도록 바꾸어 보니
왜 안드로이드 뷰어가 폴더로 나누어져 있으며, 위/아래 스크롤시

스크롤만 되고 이미지는 늦게 붙는지 알았다 :)

이걸 극복하고 실시간으로 되게 하려면

이미지 썸네일을 따로 구성하고 저장하여 빠르게 보여지게 하는 방법(그러나 따로 저장공간을 이용해야 한다)이 있는데 그러면 uri 부분이 바뀌어야 하고.

쓰레드를 넣는 것 자체가 안드로이드 getView()를 제대로 이용하는 것은 아니라서.

안드로이드 API에 적잖게 실망도 하였다.

그러나 이미지 프로세싱은 여전히 힘들구나 했고 ㅋㅋ

고성능 환경인 win8.을 또 공부해야 겠다는 생각이 들었다.

어서 빨리 다른 프로젝트 진행하고 이건 잠시 미뤄둬야 겠다.

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...