2016-02-04 51 views
0

我收到一些意想不到的行爲,我不明白。我試圖按照http://gafferongames.com/game-physics/fix-your-timestep/http://gameprogrammingpatterns.com/game-loop.html的描述實現一個固定的可變時間步長。當我在Visual Studio中運行程序時,我的inner while循環從未評估爲true;但是,當我取消註釋'this_thread :: sleep_for(1s)'時,while循環將在外循環執行10次左右後評估爲true。我希望在更快的機器上,這將是預期的結果。線程睡眠時只評估爲真

所以我的問題是,爲什麼會內環只有當「this_thread :: sleep_for(1S)」是註釋掉評估爲真?不管sleep_for是不是lagTime變得比fixedDeltaTime大?數學計算機花費了多少時間?

int updateCount = 0; 

double CLOCKS_PER_MILLISECOND((double)CLOCKS_PER_SEC * 1000.0); 
double previousTime = std::clock()/CLOCKS_PER_MILLISECOND; 
double newTime = 0, deltaTime = 0, lagTime = 0; 
double fixedDeltaTime = 1.0/60.0; 

while (gameIsRunning) 
{ 
    newTime = std::clock()/CLOCKS_PER_MILLISECOND; 
    deltaTime = newTime - previousTime; 
    previousTime = newTime; 
    lagTime += deltaTime; 

    inputSystem.update(); 
    sceneManager.update(); 

    while(lagTime >= fixedDeltaTime) // never evalutes as true? 
    { 
     physicsSystem.update(); 

     lagTime -= fixedDeltaTime; 

     updateCount++; 
    } 

    std::cerr << "-----" << updateCount << "-----" << std::endl; 

    physicsSystem.interpolate(lagTime/fixedDeltaTime); 

    renderSystem.update(); 
    audioSystem.update(); 

    updateCount = 0; 
    //std::this_thread::sleep_for(1s); 
} 

謝謝你的幫助!

回答

2

你試圖測量使用clock()時間,但這是但你在進程中的所有線程都在睡覺,不會推進的過程節拍計數器。 sleep的全部要點是告訴CPU「暫時不要給這個過程任何注意!」。就你的程序而言,時間在睡着時凍結。

如果你等待足夠長的時間,lagTime最終將推動過去fixedDeltaTime因爲時間的期間,你的程序是睡眠消耗滴答......但你必須要等待很多很多秒。

請勿使用clock()來衡量絕對的時間流逝。

+0

謝謝。我沒有意識到這一點。我將clock()切換到使用SDL函數SDL_GetTicks()並解決了問題。 有沒有一種C++標準的方法來獲得絕對時間?謝謝! – leaflet757

+0

@ leaflet757:僅當您的編譯器足夠新時http://stackoverflow.com/a/26651148/560648 –