2010-03-03 94 views
2

在我們學校,通過將遊戲構建爲課程項目來實現我們從計算機科學課程中學到的不同概念是很常見的。現在我們在我們的機器上開發了我們的遊戲,並且一切似乎都正常,遊戲速度正常,等等。現在,當我們嘗試在我們學校的計算機上測試我們的遊戲,或者當我們的教授在他自己的計算機上測試我們的遊戲時,讓我們假設他的計算機與我們開發遊戲的單位相比非常強大,遊戲速度發生了巨大變化。在大多數情況下,遊戲動畫的發生速度會比預期的快。所以我的問題是,你如何在遊戲應用程序中防止這種問題?是的,我們使用Java。在我們構建的大多數應用程序中,我們通常使用被動渲染作爲渲染技術。提前tnx!如何使不同PC上的速度(遊戲的幀速率)相同?

回答

6

你不應該依賴於你的遊戲邏輯的渲染速度。相反,要記住從遊戲中最後一個邏輯步驟到當前遊戲所花費的時間。然後,如果花費的時間超過了一定數量,則執行一個遊戲步驟(在極少數情況下,計算機如此緩慢以至於應該發生兩個步驟,您可能想要提出一個智能解決方案來確保遊戲不會不落後)。

通過這種方式,遊戲邏輯與渲染邏輯是分開的,您不必擔心遊戲更改速度,具體取決於垂直同步是打開還是關閉,或者計算機比您的速度更慢或更快。

一些僞代碼:

// now() would be whatever function you use to get the current time (in 
// microseconds or milliseconds). 
int lastStep = now(); 
// This would be your main loop. 
while (true) { 
    int curTime = now(); 

    // Calculate the time spent since last step. 
    int timeSinceLast = curTime - lastStep; 

    // Skip logic if no game step is to occur. 
    if (timeSinceLast < TIME_PER_STEP) continue; 

    // We can't assume that the loop always hits the exact moment when the step 
    // should occur. Most likely, it has spent slightly more time, and here we 
    // correct that so that the game doesn't shift out of sync. 
    // NOTE: You may want to make sure that + is the correct operator here. 
    //  I tend to get it wrong when writing from the top of my head :) 
    lastStep = curTime + timeSinceLast % TIME_PER_STEP; 

    // Move your game forward one step. 

} 
+0

好的,所以我必須在一定的時間後主動/手動呈現下一個遊戲狀態。好的TNX ... – ultrajohn 2010-03-03 09:16:52

+0

不,不一定。您在一段固定的時間後更新,但是隻要您需要,就會進行渲染。另請參閱我答案中的鏈接。 – Kylotan 2010-03-03 15:01:14

+0

是的,這就是我的意思...我只是用錯了的話......抱歉,所以渲染遊戲圖形等,但基於當前遊戲狀態更新遊戲圖形應該在固定時間之後完成。好的tnx傢伙! – ultrajohn 2010-03-03 17:04:40

0

實現可移植性的最佳方法是在繪製每個幀之間以相同的延遲發出一些Thread.sleep()命令。那麼結果將在每個系統中保持一致。由於您使用的是被動渲染,即直接在繪畫中繪製動畫,從那裏調用Thread.sleep()可能並不是最好的想法...

也許您可以更新角蛋白變量,您的動畫取決於每一對毫秒?