我正在寫一個相當簡單的2D多人-過網絡遊戲。現在,我發現自己幾乎不可能創建一個穩定的循環。我認爲穩定的意思是這樣的循環,在這種循環中進行了一定的計算,並在嚴格的時間段內重複(例如,每25毫秒,這就是我現在正在爲之奮鬥的時間)。除此之外,我還沒有遇到過很多嚴重的障礙。試圖創造一個穩定的遊戲引擎循環
在這個遊戲中,多個線程運行,無論是在服務器和客戶端應用程序,分配給各種任務。我們以服務器應用程序中的引擎線程爲例。在這個主題中,我嘗試使用Thread.sleep創建遊戲循環,嘗試考慮遊戲計算所花費的時間。這裏是我的循環,放在run()方法中。 Tick()函數是循環的有效載荷。它只是包含對不斷更新遊戲的其他方法的有序調用。
long engFPS = 40;
long frameDur = 1000/engFPS;
long lastFrameTime;
long nextFrame;
< ...>
while(true)
{
lastFrameTime = System.currentTimeMillis();
nextFrame = lastFrameTime + frameDur;
Tick();
if(nextFrame - System.currentTimeMillis() > 0)
{
try
{
Thread.sleep(nextFrame - System.currentTimeMillis());
}
catch(Exception e)
{
System.err.println("TSEngine :: run :: " + e);
}
}
}
的主要問題是,剛纔的Thread.sleep愛背叛你約多少會睡的預期。它可以很容易地把線程休息或更長的時間更短的時間,特別是在一些機器上的Windows XP(我測試過它自己,WinXP中給出真是可惡結果相比Win7和其他OS)。我在互聯網上搜索了很多,結果令人失望。這似乎是我們正在運行的操作系統的線程調度程序的錯誤,以及它的所謂粒度。據我瞭解,這個調度程序在一定的時間內不斷檢查系統中每個線程的需求,特別是把它們從睡眠中喚醒/喚醒。當重新檢查時間很短(如1ms)時,情況看起來很平穩。雖然,據說WinXP的粒度高達10或15毫秒。我也讀過,不僅是Java程序員,而且使用其他語言的人也面臨這個問題。知道這一點,製作穩定,堅固,可靠的遊戲引擎似乎幾乎是不可能的。儘管如此,它們無處不在。 我非常想知道用哪種方法可以解決這個問題。更有經驗的人能給我一個提示嗎?
以最大FPS運行並根據實際幀時間而不是常數進行計算。 – Erik 2011-03-23 12:13:57