我正在使用SurfaceView for android制作这个简单的2D画布游戏,我的游戏循环遇到了这个问题:随着时间的推移,fps会大大降低。我在本文中找到了游戏循环的设计:deWiTTERS Game Loop。
GamePanel.java
package jacobmahoney.guardianofearth;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.view.Display;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.WindowManager;
public class GamePanel extends SurfaceView implements SurfaceHolder.Callback {
private MainThread thread;
private SpaceshipObject spaceship;
private LeftCircle leftCircle;
private RightCircle rightCircle;
private int screenWidth;
private int screenHeight;
public GamePanel(Context context) {
super(context);
getHolder().addCallback(this);
thread = new MainThread(getHolder(), this);
setFocusable(true);
getScreenSize(context);
spaceship = new SpaceshipObject(screenWidth, screenHeight);
leftCircle = new LeftCircle(screenWidth, screenHeight);
rightCircle = new RightCircle(screenWidth, screenHeight);
}
public void getScreenSize(Context context) {
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getRealSize(size);
screenWidth = size.x;
screenHeight = size.y;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
thread = new MainThread(getHolder(), this);
thread.setRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
while (retry) {
try {
thread.setRunning(false);
thread.join();
} catch(Exception e) {
e.printStackTrace();
}
retry = false;
}
}
public void update() {
rightCircle.update();
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
canvas.drawColor(Color.BLUE);
spaceship.draw(canvas);
leftCircle.draw(canvas);
rightCircle.draw(canvas);
}
}
MainThread.java
package jacobmahoney.guardianofearth;
import android.graphics.Canvas;
import android.util.Log;
import android.view.SurfaceHolder;
public class MainThread extends Thread {
private SurfaceHolder surfaceHolder;
private GamePanel gamePanel;
private boolean running;
public static Canvas canvas;
public void setRunning(boolean running) {
this.running = running;
}
public MainThread(SurfaceHolder surfaceHolder, GamePanel gamePanel) {
super();
this.surfaceHolder = surfaceHolder;
this.gamePanel = gamePanel;
}
@Override
public void run() {
int TICKS_PER_SECOND = 50;
int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
int MAX_FRAMESKIP = 10;
long next_game_tick = System.currentTimeMillis();
int loops;
long prev = System.currentTimeMillis();
while (running) {
Log.d("MainThread", "" + (System.currentTimeMillis() - prev)); // this value drastically increases over time
prev = System.currentTimeMillis();
loops = 0;
while (System.currentTimeMillis() > next_game_tick && loops < MAX_FRAMESKIP) {
this.gamePanel.update();
next_game_tick += SKIP_TICKS;
loops++;
}
canvas = this.surfaceHolder.lockCanvas();
this.gamePanel.draw(canvas);
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
非常感谢任何帮助,谢谢!
修改
在评论了GamePanel.java中游戏对象的所有实例:leftCircle,rightCircle和spaceship 完全之后,我没有遇到随着时间的推移游戏变得越来越迟钝的问题,我猜猜很明显。然后,当我把太空船游戏对象放回到混合中时,随着时间的推移游戏仍然变得越来越滞后,但是比我将所有三个游戏对象绘制到画布时的速度更小。
我完全被难倒了,我真的不知道是什么原因引起了这个......任何想法?
的 EDIT2:
除去
的 EDIT3:
找出问题所在。这是我用来为每个对象绘制路径的代码的问题。我忘记在用于绘制路径的代码之前和之后放置 path.reset()和 path.close()。我也删除了我的edit2,因为我在沮丧的情况下发表评论,这是无根据的。