去年春天在大学学习Android,最后一项任务是开发一款游戏。我不会给出关于游戏本身的任何细节,但我使用了一个将SurfaceView作为游戏面板并将游戏循环放入后台线程的类。游戏花了一个月的时间完成,但结果非常好 - 非常好,我在Android市场上推出了它,现在有更多的下载。但是有一个相当大的缺点,它在这里:帧速率不恒定android游戏
为了在这个任务中获得最高的速度,必须制作一个游戏,帧频必须是恒定的。而且因为我获得了最高学位,老师对我的源代码非常满意,所以我认为没有错误修正。但是 - 事情是帧速率不是恒定的。更奇怪的是:在屏幕上移动的图形对象 - 移动速度越慢,CPU速度越快。
我有三部手机不同的型号,显示三种不同的速度:
- SAMSUNG GALAXY MINI(处理器时钟速度1 GHz)这里的物体快速移动
- 三星GALAXY S3(处理器主频1.8 GHz的)在此,对象移动以中等速度
- SAMSUNG GALAXY S4(处理器时钟速度2.3千兆赫)在这里,对象移动缓慢
所以简要 - 更强大吨智能手机处于处理器环境中时,图形对象在屏幕上移动的速度越慢 - 人们可能会想到相反的情况 - 对于速度更快的智能手机,帧速率更高。
我提出下面的backgroundthread持有gameloop - 我看不出我做错了什么在此代码 - 也不是我的老师
public class MainThread extends Thread {
private static final String TAG = MainThread.class.getSimpleName();
private final static int MAX_FPS = 50; // Antal frames per sekund.
private final static int MAX_FRAME_SKIPS = 5; // Antal förlorade frames.
private final static int FRAME_PERIOD = 1000/MAX_FPS;
private SurfaceHolder surfaceHolder;
private GamePanel gamePanel;
private boolean running;
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() {
Canvas canvas;
Log.d(TAG, "Starting game loop");
long beginTime; // Cykelns starttid
long timeDiff; // Tiden det tar för en cykel
int sleepTime; // Cykel (update + render = timediff) + sleeptime => frameperiod.
int framesSkipped; // Antalet förlorade frames.
sleepTime = 0;
while (running) {
canvas = null;
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
beginTime = System.currentTimeMillis();
framesSkipped = 0;
try {
this.gamePanel.update_graphics();
this.gamePanel.render_graphics(canvas);
}
catch (Exception e) {
System.out.println("fel uppstod i bakgrundstråden: " + e);
}
timeDiff = System.currentTimeMillis() - beginTime;
sleepTime = (int)(FRAME_PERIOD - timeDiff);
//System.out.println("sleeptime: " + sleepTime);
if (sleepTime > 0) {
// Sleeptime ska vara positiv, med marginal. (Annars risk för hackig animation)
try {
Thread.sleep(sleepTime); // Tråden sover en stund.
} catch (InterruptedException e) {}
}
while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) {
// Används för att "komma igen/komma ikapp".
try {
this.gamePanel.update_graphics(); // endast updatering.
}
catch (Exception e) {
System.out.println("fel uppstod i bakgrundstråden: " + e);
}
sleepTime += FRAME_PERIOD;
framesSkipped++;
}
if (framesSkipped > 0) {
//Log.d(TAG, "Skipped:" + framesSkipped);
}
}
} finally {
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
} // slut finally
}
}
}
在此先感谢
我不确定物体为什么缓慢移动,仍然在想那个......但是有一个提示 - 你的更新方法应该接受增量时间。这样,您的对象可以考虑更新时间。 –
也许这可以帮助你http://gafferongames.com/game-physics/fix-your-timestep/ – Rad1