프로그래밍/C#, .NET

[.NET] 게임 루프(Game Loop)를 구현할 때는 'Environment.TickCount'를 사용하면 안 된다.

당근천국 2022. 4. 22. 15:30

Environment.TickCount를 써서 게임 루프(Game Loop)를 만들었는데 계산한 FPS와 다르게 나옵니다???

 

1. 'Environment.TickCount'의 문제

원인을 찾던 중 발견한 내용

MS Docs - Environment.TickCount 속성

 

아......

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

'Environment.TickCount'의 정밀도가 10~16ms이라고 합니다.

그러니 타이밍이 딱 맞지 않으면 60FPS가 나올 수가 없다는 것이죠.

(윈도우 타이머와 직접 구현한 타이머의 타이밍이 일치해야 됨.)

 

 

2. 다른 것을 쓰자

마침 이것과 관련하여 좋은 글을 찾았습니다.

stackoverflow mistika님의 답변 - Environment.TickCount vs DateTime.Now

MS Docs - 고해상도 타임스탬프 획득

 

 

답변을 요약하자면

1) 대안으로 DateTime.Ticks와 Stopwatch가 있다.

2) DateTime.Ticks는 운영체제에 따라 차이가 난다.

3) Stopwatch는 고해상도 타이머를 우선 사용하고

4) 운영체제가 지원하지 않으면 'DateTime.Ticks'를 사용한다.

 

한마디로 고정밀 작업을 할 거면 'Stopwatch'를 써야 한다는 것입니다.

물론 이마저도 운영체제에 따라 신뢰할 수 없다는 문제가 있습니다.

(이런 건 하나하나 테스트해보고 처리할 수밖에 없죠.)

 

 

 

마무리

결론은 'Stopwatch'를 써라~

 

테스트용 프로젝트 : github - dang-gun/DotNetSamples/GameLoopTest