2016-12-29 16 views
1

sfml로 게임 루프를 작성하고 있습니다. 내가 잠을 자지 못하게 할 때, 각 루프 반복마다 경과 된 시간은 ~ 1ms입니다. 그러나 수면 (수면 시간)을 추가 할 때 갑자기 dt가 높습니다. 루프의 시작 부분에서 dt를 다시 시작했지만 마지막 sleep 시간을 더하는 것으로 보입니다. 그 원인은 무엇입니까? 수면 https://aww.moe/sn1z0a.png게임 루프에서 sleep()을 사용하면 델타 시간이 불안정합니다.

: 수면없이

sf::Clock clock; 
float dt; 
sf::Time sleepTime = sf::milliseconds(0); 

while(m_Window.isOpen()) 
{ 
    sf::Time elapsed = clock.restart(); 
    dt = elapsed.asMilliseconds(); 

    cout << "Elapsed: " << dt; 

    sf::Event event; 

    while(m_Window.pollEvent(event)) 
    { 
     switch(event.type) 
     { 
      case sf::Event::Closed: 
       m_Window.close(); 
       break; 
     } 
    } 

    sleepTime = sf::milliseconds(16 - dt); 

    float time = sleepTime.asMilliseconds(); 
    cout << "\tSleep time: " << time << endl; 

    if(sleepTime >= sf::Time::Zero) 
    { 
     sf::sleep(sleepTime); 
    } 
    else 
    { 
     cout << "Shit." << endl; 
    } 

https://aww.moe/7seof1.png

+5

수면으로 인해 발생합니다. 왜 자고 있니? –

+0

게임 속도를 일정하게 유지하고 싶습니다. 나는 이것을 다음과 같이 사용하고있다 : http://www.koonsolo.com/news/dewitters-gameloop/. – Glamhoth

+0

그리고 그 수면은 매우 정확하지 않습니다. 하지만 루프의 시작 부분에서 dt를 다시 시작합니다. 왜 수면 시간이 dt에 추가됩니까? – Glamhoth

답변

3

당신이 할하려는 - 특정 프레임 속도로 게임을 제한하는 - 이미 SFML에 내장되어 있습니다. 매개 변수로 의도 된 프레임 속도로 sf::Window::setFrameRateLimit()으로 전화하면 설정됩니다. 또한 목표 시스템이 원하는 프레임 속도에서 렌더링 할 수없는 경우 게임 속도가 느려지므로 수직 동기화 (sf::Window::setVerticalSyncEnabled() 사용)를 사용하여 프레임/업데이트 수를 제한 할 수도 있습니다. 120 또는 140Hz에서 실행되는 고급 화면의 경우 속도 향상).

그러나 일반적으로 현재 컴퓨터가 화면을 충분히 빠르게 업데이트 할 수없는 경우에도 게임 속도가 느려지지 않도록 게임 업데이트를 프레임 속도에서 분리하려고합니다.

일반적으로 (이 메모리에서, 그래서 버그 나 오타를 포함 할 수 있습니다)과 같이 표시됩니다 SFML을 사용하는 기본적인 접근 방식을 :

sf::Clock updateTimer; // Clock to monitor the time passed 
sf::Time passedTime; // Accumulated game time 
const sf::Time frameTime(sf::milliseconds(10)); // intended time per frame; here: 10ms 

while (window.isOpen()) { 
    sf::Event event; 
    while (window.pollEvent(event)) { 
     // Event handling 
    } 

    // First add the time passed 
    passedTime += updateClock.restart(); 

    unsigned int numUpdates = 0; // Count the updates done 

    // As long as enough time passed, do an update 
    // Up to a specific maximum to avoid problems, e.g. 
    // the main thread was blocked or can't catch up 
    while (passedTime >= frameTime) { 

     if (numUpdates++ < 10) { 
      // Do your game update here 
     } 

     // Subtract the time we've "handled" 
     passedTime -= frameTime; 
    } 

    window.clear(); 
    // Draw your game here 
    window.display(); 
} 

numUpdates의 사용은 처음에는 분명하지만, 단지 상상하지 않을 수 있습니다 시스템이 간혹 원하는 초당 100 개의 업데이트를 실행할 수있는 상황. 만약 당신이 20 번 업데이트 (일부 hick-up 또는 무엇이든)를하면 머신은 결코 제대로 다시 따라 올 수 없으므로 말더듬이나 게임이 응답하지 않게됩니다.

+0

http://pastebin.com/VvWLewmA 조금 변경했습니다. 일하는 것 같습니다. – Glamhoth

+0

@Glamhoth 타이머를 다시 시작하지 마십시오 (마지막에). 그렇지 않으면 모든 것을 그려야하는 데 걸린 시간을 잃어 버리는 것입니다. – Mario

+0

감사합니다! – Glamhoth