마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

SurfaceView에 이미지를 Draw 하면서 생기는 속도개선방안

0 추천

SurfaceView 사용해서 간단한 게임을 만들고 배경이미지나 버튼등 여러가지 이미지를 draw()해주고있습니다.
그런데 이미지를 추가하면할수록 프레임속도가  떨어지는게 느껴지더군요
이미지를 draw 하면서 프레임을 줄이기위해서 할수있는방법이있을까요?
 

FPS, System.currentTimeMilli등으로 속도 조절을 한다고 하는데 잘 모르겠습니다.

배경화면에 게임이미지 몇장만 그려줘도 확연히 느려지는게 보이는데 (원래 아무것도없는화면에 한번루프가 0.02초가 나온다면 이미지 몇장만 추가해도 0.07 정도로 확느려집니다.)
제가 드로우하는부분에 문제가있는것도같고..
제가  draw 방법은 loop내의 ondraw부분에서 홀더 락 걸고 풀어줍니다.

///
 
 첫번째 배경이미지 로딩시에 속도 저하 없음

  Canvas canvas = mHolder.lockCanvas(null);  
  background = BitmapFactory.decodeResource(res, R.drawable.back);
  background = Bitmap.createScaledBitmap(background, Width, Height, true);
  canvas.drawBitmap(background, 0, 0, null); 

///
 깃발 4개 이상 획득시 스테이지배경이 바뀌면서 새로운 적들이 발생하는데 여기서 속도가 크게 저하됩니다.
 --> 두번째 배경이미지 및 기타 이미지 발생 로딩시에 3초 정도 속도 저하 발생
  
   background2 = BitmapFactory.decodeResource(res, R.drawable.bossbackground);
   background2 = Bitmap.createScaledBitmap(background2, Width, Height, true);
   canvas.drawBitmap(background2, 0, 0, null);

///
 draw 작업 끝
   mHolder.unlockCanvasAndPost(canvas);      
/// 

  loop에서 ondraw를 돌려주고 있습니다. 
surfaceview에서 loophandler를 사용하고 있습니다.
게임 속도는 handler에서 sleep메시지를 통해 속도를 조절하고 있습니다.
 
surfaceview create에서는
 public void surfaceCreated(SurfaceHolder holder) {
  hero = new Hero(this);
  target = new Target(this);
  boss = new Boss(this);
  for(i = 0; i< bulletCnt; i++)
   bullet[i] = new Bullet(hero, this);  
  startTime = System.currentTimeMillis();
  mLoopHandler.start();
위와 같이 적용중입니다.
starttime은 단순히 게임 진행 시간을 뿌려주는것에 지나지 않습니다.
  

서피스뷰로 게임 작업하신분들 도움좀 부탁드리겠습니다.
참고로 bitmap 메모리 해제를 해봤는데 별 차이가 없습니다. ex) background.recycle()
익명사용자 님이 2013년 11월 3일 질문

2개의 답변

0 추천
bitmap 연산의 경우 CPU의 부하가 큽니다.
자주 쓰는 이미지는 ondraw에서 처리하지 말고, 
사전에 로딩할 때  미리 구한 후  사용하시는 것을 권장 드리며,
이미지의 해상도도 속도에 영향을 미치니, 퀄리티에 큰 차이가 없다면,
가급적 작은 사이즈의 이미지를 사용하시는 것을 권장합니다.
사악미소 (65,330 포인트) 님이 2013년 11월 4일 답변
0 추천
ondraw 하는곳에서 bitmap 가져오는 작업을 하시면 느립니다...

 

자주 사용하시는 비트맵은 메모리에 미리 올려두고 하시면 속도 저하는 없을것입니다..

하지만 너무 많은 비트맵을 메모리에 올리시면 죽을수도...
HeyLee (850 포인트) 님이 2013년 11월 5일 답변
...