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()