去年春天在大學學習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