2012-06-03 40 views
1

這讓我瘋狂,無論如何,通常的故事,試圖保證在我運行它的任何Windows機器上的非常簡單的遊戲中保持相同的速度。即時通過指定一個1/60值來實現,然後確保一個fram無法運行,直到該值自上次調用時間過去爲止。由於某種原因,我的問題是1/60相當於30hz,我必須將它設置爲1/120才能得到60hz。它也不會在60hz上爆炸,它有點快。gameloop framerate控制問題

如果我把它粘貼在這裏,有人可以告訴我他們是否看到任何錯誤?或者更準確的方式來做到這一點?

float controlFrameRate = 1./60 ; 

while (gameIsRunning) 
{ 
    frameTime += (system->getElapsedTime()-lastTime); 
    lastTime = system->getElapsedTime(); 

    if(frameTime > controlFrameRate) 
    { 
     gameIsRunning = system->update(); 
        
     //do stuff with the game 

        frameTime = .0f;          
    } 
} 

回答

3

不要致電getElapsedTime兩次,兩次調用之間可能會有細微的差異。相反,存儲它的價值,然後重新使用它。此外,不是將frameTime設置爲0,而是從中減去controlFrameRate,這樣,如果一幀需要更長的時間,下一個會稍微縮短一點。

while (gameIsRunning) 
{ 
    float elapsedTime = system->getElapsedTime(); 

    frameTime += (elapsedTime-lastTime); 
    lastTime = elapsedTime; 

    if(frameTime > controlFrameRate) 
    { 
     gameIsRunning = system->update(); 

     //do stuff with the game 

     frameTime -= controlFrameRate; 
    } 
} 

我不確定您的問題,必須將速率設置爲1/120,您在這裏使用什麼時間API?

+0

哥們不僅得到了幀率,還解決了我的1./60!=60hz問題,你是一個天才。乾杯。 –

+0

我是否明智地儘可能刷新圖形,同時僅限於遊戲邏輯?即在幀時間檢查之外是否有對渲染器的調用? –