2012-10-30 5 views
2

나는 XNA 게임을 만들고 있는데, 낮 시간 시스템을 만들 때가되었다. 그래서 나는 어떤 종류의 시계가 필요하다. GameTime.TotalGameTime.Milliseconds == 0을 사용하여 내 맞춤 시계 클래스의 두 번째 카운터에 1 초를 추가하려고 시도했지만 GameTime이 항상 0 밀리 초를 통과하지는 않습니다. TimeSpan prevUpdate을 사용하여 TotalGameTime.TotalSeconds과 비교하면 정확도가 충분하지 않으며 시간이 어떻게 든 실시간보다 현저히 느립니다.XNA에서 정확한 시계를 만드는 방법은 무엇입니까?

너무 많은 리소스를 필요로하거나 실시간에서 눈에 띄게 벗어날 수 없도록 XNA 또는 .Net 구성 요소를 사용하여 시계를 켤 수 있습니까?

답변

3

고정밀 타이밍 (reference)에는 Stopwatch을 사용하십시오.

XNA의 GameTime을 렌더링 및 프레임 간 타이밍 로직에 사용하십시오. XNA의 타이머가 "벽시계"시간과 정확하게 일치하지 않습니다. 프레임 렌더링으로보다 잘 정렬되도록 표류 할 수있어보다 부드러운 애니메이션을 제공합니다 (이것은 동작이 Game 클래스에서 제공됨). 시간이 지남에 따라 실시간에서 약간 벗어날 것입니다. 그러나 대부분의 게임에서는 이것이 문제가 아닙니다.

DateTime을 사용하면 더 긴 시간 범위 (예 : 분, 시간)를 정확하게 측정 할 수 있습니다.


당신이 알 수 없기 때문에 당신이 하나 개의 프레임에 Milliseconds == 999을 가질 수 있도록 XNA, 당신의 Update 메서드를 호출 정확하게 할 때, Milliseconds == 0을 비교하지 말아야 참고 다음 Milliseconds == 15 다음 - 주변 포장 및 과거 건너 뛰는 0 , 그래서 당신의 상태가 결코 트리거되지 않습니다.

그래서 타이머가 임계 값을 초과 할 때를 결정해야합니다. 이를 수행 할 수있는 많은 방법이 있습니다. 임계 값을 추적 할 수 있습니다 (일부 "총"시간을 추적하는 경우 유용), 각 트리거 후에이를 증가시킵니다. 개인적으로 나는 이렇게 시간을 축적하는 것을 선호합니다 :

seconds += gameTime.ElapsedTime.TotalSeconds; 
if(seconds > 1.0) 
{ 
    seconds -= 1.0; 
    DoSomething(); // Triggered each second 
} 
관련 문제