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

SurfaceView를 구현했는데 너무 느리네요 ㅠㅠ

0 추천

	
Surfaceview를 이용해서 퍼즐게임을 만들고 있습니다.
40개 타일을 배치한다음 터치이벤트를 통해서 위에 사각형을 그리는데
너무 느리네요 ㅠㅠ... 어디가 잘못된걸까요...

//메인액티비티
public class MainActivity extends Activity {

private NemoView nemo;
private GestureDetector touch;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setBackgroundDrawable(null);


nemo = new NemoView(this);
setContentView(nemo);

touch = new GestureDetector(this, listener);

}

public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
if (nemo.isDrawOn()) {
nemo.DrawSelectRect(0, 0, 0, 0, false);
}
}

return touch.onTouchEvent(event);
}

OnGestureListener listener = new OnGestureListener() {

public boolean onDown(MotionEvent e) {
return false;
}

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;
}

public void onLongPress(MotionEvent e) {
}

public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
nemo.DrawSelectRect(e1.getX(), e1.getY(), e2.getX(), e2.getY(),
true);
return false;
}

public void onShowPress(MotionEvent e) {
}

public boolean onSingleTapUp(MotionEvent e) {
return false;
}

};

}

//SurfaceView
public class NemoView extends SurfaceView implements SurfaceHolder.Callback {

private SurfaceHolder holder;
private TileThread thread1;
private Canvas canvas;
private Tile[][] tile = new Tile[8][5];

private Random random;
private int wTile, hTile;
private Resources res;
private Bitmap bitmap;
private float rx, ry, rw, rh;
private boolean drawOn;
private Paint rect_paint;

public NemoView(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
res = getResources();
random = new Random();

wTile = 120;
hTile = 120;

mkTiles();

rx = 0;
ry = 0;
rw = 0;
rh = 0;
drawOn = false;
rect_paint = new Paint();
rect_paint.setColor(Color.BLACK);
rect_paint.setStyle(Style.STROKE);
rect_paint.setStrokeWidth(15);

}

public void mkTiles() {

for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 7; j++) {
tile[j][i] = new Tile();
tile[j][i].setColor(random.nextInt(4));
}
}
}

public void DrawSelectRect(float x, float y, float w, float h, boolean on) {
if (on) {
rx = x;
ry = y;
rw = w;
rh = h;
drawOn = true;
} else {
rx = x;
ry = y;
rw = w;
rh = h;
drawOn = false;

}
}
public Bitmap setTile(int a){

switch(a){
case 0:
bitmap = BitmapFactory.decodeResource(res, R.drawable.dong1);
break;
case 1:
bitmap = BitmapFactory.decodeResource(res, R.drawable.star1);
break;
case 2:
bitmap = BitmapFactory.decodeResource(res, R.drawable.semo1);
break;
case 3:
bitmap = BitmapFactory.decodeResource(res, R.drawable.nemo1);
break;

}
return bitmap;
}

class TileThread extends Thread {

private SurfaceHolder holder;
private Canvas canvas;
private Paint paint;

public TileThread(SurfaceHolder holder) {
this.holder = holder;
paint = new Paint();
}

public void run() {
while (true) {

synchronized (holder) {
canvas = holder.lockCanvas();
canvas.drawColor(Color.WHITE);
for (int i = 0; i <= 4; i++) {
for (int j = 0; j <= 7; j++) {
canvas.drawBitmap(setTile(tile[j][i].getColor()),j*wTile,i*hTile,null);
}
}
if (drawOn) {
canvas.drawRect(rx, ry, rw, rh, rect_paint);
}

holder.unlockCanvasAndPost(canvas);
}
}
}
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}

public void surfaceCreated(SurfaceHolder holder) {

thread1 = new TileThread(holder);
thread1.start();
}

public void surfaceDestroyed(SurfaceHolder holder) {
}

public boolean isDrawOn() {
return drawOn;
}

public void setDrawOn(boolean drawOn) {
this.drawOn = drawOn;
}

}

 

 

 

흰눈psy로 (120 포인트) 님이 2013년 7월 10일 질문

1개의 답변

0 추천
의심이 갈만한 부분이라면

 

public Bitmap setTile(int a){

switch(a){
case 0:
bitmap = BitmapFactory.decodeResource(res, R.drawable.dong1);
break;
case 1:
bitmap = BitmapFactory.decodeResource(res, R.drawable.star1);
break;
case 2:
bitmap = BitmapFactory.decodeResource(res, R.drawable.semo1);
break;
case 3:
bitmap = BitmapFactory.decodeResource(res, R.drawable.nemo1);
break;

}
return bitmap;
}

이 부분이 중첩 루프 안에서 대략 27번 호출 되는데, 매번 BitmapFactory 를 통해서 리소스로 부터 비트맵으로 디코드 작업을 하고 있습니다. 이미지 4개에 대한 Bitmap 을 SurfaceView 가 만들어지는 시점에서 미리 생성해두고 해당 함수 호출시에는 만들어진 이미지를 Switch 문에 따라서 연결해 주는 것이 속도면에서 상승 효과를 가져올 수 있습니다.
coooldh (2,510 포인트) 님이 2013년 7월 10일 답변
우와 완전 감사합니다. ㅠㅠ 큰 도움이 됐네요..
...