2011-09-21 2 views
1

프레임 속도의 변동이 더 이상 문제가되지 않도록 게임 루프에서 델타 시간을 구현했습니다. 그러나 더 빠른 머신에서는 게임이 더 빨라지고 느린 머신에서는 느리게 실행되지 않습니까?고정 게임 업데이트주기

저는 대부분의 게임이 로직을 고정 속도 (초당 60 회)로 업데이트 한 다음 최대한 많은 렌더링을 수행한다는 인상하에있었습니다. 초당 원하는만큼 업데이트 루프를 만들 수 있습니까?

+0

http://gamedev.stackexchange.com/ – JJJ

답변

1

게임 루프가 실행될 때마다 누적기를 사용하십시오. + = 경과 한 시간의 델타. 이 시간이 16.6666667 초보다 길면 업데이트 논리를 실행하고 시간에서 60 초를 뺍니다. 누적 기가 < 60 초 :-)가 될 때까지 업데이트 방법을 계속 실행하십시오.

의사 코드!

const float updateFrequency = 16.6666667f; 
float accumulator = updateFrequency; 

public void GameLoop(float delta) 
{ 
    // this gets called as fast as the CPU will allow. 
    // assuming delta is milliseconds 
    if (accumulator >= updateFrequency) 
    { 
     while (accumulator >= updateFrequency) 
     { 
      Update(); 
      accumulator -= updateFrequency; 
     } 
    } 

    // you can call this as many times as you want 
    Draw(); 

    accumulator += delta; 
} 

이 기술은 그리기 방법이 업데이트 빈도보다 오래 걸리면 따라 잡을 것입니다. 물론 드로잉 메서드가 일주일에 1/60 초 이상 걸리는 경우 그리기 통과 사이에 여러 번 업데이트를 호출해야하기 때문에 문제가 발생할 수 있으므로주의해야합니다. 렌더링에서 딸꾹질.

+0

답장을 보내 주셔서 감사합니다.하지만 166.666667 수치는 어디에서 나온 것입니까? – SirYakalot

+1

166.666 ... 밀리 초 == 1/60 초. – JJJ

+1

도와 주셔서 감사합니다. 실제로 초의 60 분의 1은 16.666입니다 ... 그렇지 않습니까? – SirYakalot