누구든지이 간단한 코드로 나를 도울 수 있습니까? 원이 왜 부드럽게 움직이지 않습니까? 무엇이 문제입니까?안드로이드 매우 기본적인 게임 개발
package chaseme;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
public class ChaseMe extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new SampleView(this));
}
private class SampleView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
private Point point;
private Thread thread;
private SurfaceHolder holder;
private Paint _rect;
private Paint _circle;
private boolean running;
private int WIDTH;
private int HEIGHT;
private float radius = 20;
public SampleView(Context context) {
super(context);
point = new Point(20, 20);
_rect = new Paint();
_rect.setColor(Color.BLACK);
_circle = new Paint();
_circle.setColor(Color.BLUE);
holder = this.getHolder();
holder.addCallback(this);
thread = new Thread(this);
}
private void updateModel() {
if(point.x > WIDTH - radius) {
point.x = 20;
}
if(point.y > HEIGHT - radius) {
point.y = 20;
}
point.x++;
point.y++;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}
@Override
public void surfaceCreated(SurfaceHolder holder) {
WIDTH = getWidth();
HEIGHT = getHeight();
this.setRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
this.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
}
catch (InterruptedException e) {}
}
}
private void setRunning(boolean b) {
running = b;
}
@Override
public void run() {
while(running) {
Canvas c = null;
updateModel();
try {
c = holder.lockCanvas(null);
// synchronized (holder) {
render(c);
// }
}
catch(Exception e) {
Log.e("main", e.getMessage());
}
finally {
if(c!=null) {
holder.unlockCanvasAndPost(c);
}
}
}
}
private void render(Canvas c) {
c.drawRect(0, 0, WIDTH, HEIGHT, _rect);
c.drawCircle(point.x, point.y, radius , _circle);
//c.save();
//c.restore();
}
}
}
렌더링시 콘솔에 몇 가지 내용을 인쇄하면 프레임 속도가 좋아 지나요? 애니메이션 프레임간에 스레드를 절대로 절대로 요구하지 않으면 앱이 너무 빠르게 실행되지 않는지 궁금합니다. – Snicolas
글쎄, 문제가 뭔지 알아, 에뮬레이터가 매우 느리게 실행됩니다, 나는 fps를 볼 테스트를 실행하고 약 20에서 10으로 떨어집니다. – Yotam
장치는 안드로이드에 대한 유일한 실제 세계 테스트입니다. 앱을 디버그하는 가장 빠른 방법이기도합니다. 필자는 에뮬레이터를 사용하여 내 장치가 테스트 할 수없는 것을 테스트합니다 (해상도, SDK 버전 ...). 하지만 대개 기기에서 내 코드를 테스트합니다. – Snicolas