2013-08-05 76 views
2

我現在正試圖在SFML中編程我的第一個遊戲(以及我的第一個整體遊戲),但我碰到了一個問題,我每秒鐘都會遇到一次口吃。在這樣的口吃期間,Frametime比正常情況高出3到4倍,這真的很明顯,只要我沒有運行真正的高FPS(300+)。如何調整遊戲循環幀率?

沒問題(至少大氣壓)的性能是不是一個問題,而是:

在做我的運動方法真的怪胎和移動方式方法要慢,這是應該做的。

我的運動方法:

void Player::Update(float frametime){ 
    mMovementSpeedTimefactor = frametime * 60/1000.0f; 

    setMovementVector(sf::Vector2f(mMovementVector.x * mMovementSpeedTimefactor, mMovementVector.y *mMovementSpeedTimefactor)); 
    validateMovement(); 
    //std::cout << mTestClock->restart().asMilliseconds() << std::endl; 

    moveObject(); 
    this->updateAnimation(); 
} 

幀時間以毫秒爲單位的幀時間,且i乘以60,如我的movementspeed每幀設置爲用於像素/秒的值,而不是。

運動速度是5,所以角色應該每秒移動5 px,無論我有FPS(因此Frametime)。

但是:這給了我真正的跳躍運動,因爲那些「stutterframes」導致了跳躍,並且在沒有停頓的幀上,palyer移動的速度比它應該慢很多。

我的主循環非常簡單,只需

while(mMainWindow->isOpen()){ 

     HandleEvents(); 
     Update(); 
     Render(); 
    } 

同時使用inbuild framelimiter(試圖寫我自己,但我得到了同樣的結果,只要我使用SF:睡眠調節FPS不使CPU核心以100%負載運行)至300 FPS。

所以是的,我可以將我的標準速度設置爲1而不是5,但 setframeratelimit不是很準確,所以我得到一些運動速度的變化,我真的不喜歡。

任何人都有一個想法,我最好能做什麼?也許我沒有看到所有樹木的森林(我實際上不知道你是否用英語說P:但是因爲這是我的第一場比賽,我沒有經驗可以回顧。

回答

1

frametime確實很高或很低時,由於浮點精度問題,您的計算可能無法正常工作。我建議設置標準速度,也許,500mMovementSpeedTimeFactorframetime * 60/10.0f並檢查問題是否仍然發生。

+0

非常感謝,我會試試看。 – Daepilin

+0

嗯,沒有工作。我想我必須爲'frametime'設置一個最大值,否則我將永遠得到這些跳轉。 +雖然它應該導致相同的值,但它仍然比僅將速度設置爲1.0慢很多... 那麼,現在我想我繼續使用內部framelimiter,並將我的速度設置爲「應該」幀速率。我想我總是可以改變,但我真的很沮喪。 但是,謝謝你的建議:) – Daepilin

+0

嘗試偶爾編寫'mMovementSpeedTimeFactor'到控制檯,並檢查它是否接近0以確認/不確認我的原始想法 –

2

相似問題:Movement Without Framerate Limit C++ SFML

你真正需要的是固定的時間步驟。 看看SFML遊戲開發書source code。下面是從Application.cpp有趣的片段:

const sf::Time Game::TimePerFrame = sf::seconds(1.f/60.f); 

    [...] 

    sf::Clock clock; 
    sf::Time timeSinceLastUpdate = sf::Time::Zero; 
    while (mWindow.isOpen()) 
    { 
     sf::Time elapsedTime = clock.restart(); 
     timeSinceLastUpdate += elapsedTime; 
     while (timeSinceLastUpdate > TimePerFrame) 
     { 
      timeSinceLastUpdate -= TimePerFrame; 

      processEvents(); 
      update(TimePerFrame); 

     } 

     updateStatistics(elapsedTime); 
     render(); 
    } 

編輯:如果這不是真的你想要什麼,請參閱「Fix your timestep!」這洛朗戈米拉自己在SFML論壇鏈接。

+0

對不起,沒有看到這個更早(因爲我沒有時間爲我的遊戲atm我沒有檢查),但不會導致100%的核心負載? – Daepilin

+0

爲什麼你不想把所有的果汁留給當前正在運行的遊戲應用程序?或者你正在做一個被動的遊戲? (熱門,回合制)或者它是一種手機遊戲,電池壽命真的很重要?但正如我所看到的,在您提供的示例中,您已經使用了100%的CPU。而是否使用100%的CPU本身就是另一個問題。 –

+0

我在我的回答中添加了一個鏈接到[Fix your Timestep](http://gafferongames.com/game-physics/fix-your-timestep/)文章。 –