결론부터 얘기하자면 스토리보드든 타이머든 정밀도는 서로 같았으며, 양쪽다 타이머의 최소 인터벌에 따라 MaxFramerate와 관계 없이 상당히 부정확한 Tick을 얻게 되는군요. 또한 일부 인터벌의 경우 특정 FPS에서 납득하기 어려운 결과가 나오기도 하는데요, 이렇게 되면 뭔가 실험 설계를 잘못한 게 아닌가 하는 생각마저 드네요.

우선 작동 완구와 소스부터...




실험 설계

간단해요. 우선 실버라이트 플러그인의 Settings 속성을 통해 MaxFramerate를 설정하여 최대 FPS를 제한하고 빈 Storyboard를 이용한 게임루프와 DispatcherTimer를 이용한 게임루프 각각의 interval을 ms단위로 설정한 후 버튼을 클릭하면 10초 동안 매 게임루프에서 카운트를 업하고 10초가 지나면 그동안 카운트된 개수를 10으로 나눠서 1초당 카운트 수를 구하는거죠. 일반적인 FPS 검출 로직과 큰 차이 없다고 생각해요.

그.런.데. 결과는 상당히 흥미롭네요.

1. 인터벌을 0ms(=MaxFramerate) 즉, 최대 값으로 설정했을 때

네, MaxFramerate에 상당하는 거의 오차 범위 내의 값이 나와요. 다만 실버라이트 런타임이 지원하는 최대 Framerate인 60FPS가 되면 다른 것보다 오차가 커지는 것이 약간 거슬리는 정도죠.

2. 인터벌을 15ms(=66FPS) 즉, 일반적인 Windows 시스템 타이머의 최소 해상도로 설정했을 때

이것도 0ms로 했을 때랑 거의 차이가 없어요.

3. 인터벌을 16ms(=62FPS)로 설정했을 때

아주 이상하게도, MaxFramerate를 60으로 설정했을 때 오차가 갑자기 심해지는 현상이 나왔어요. 심지어 50FPS일 때보다도 더 떨어지는 Framerate가 나온거죠.

4. 인터벌을 50ms(=20FPS)로 설정했을 때

별로 높은 FPS도 아닌데 의외로 오차가 심하죠?

이 외에도 수치를 바꿔가면서 테스트 해 보면 잘 이해되지 않는 결과를 얻는데요, 이쯤되니 제 코드도 의심되더군요. 여튼 관심있는 분은 받아서 테스트를 한번 해보세요.

만약 제 실험 설계에 문제가 없다면 다음과 같은 결론을 얻을 수 있어요.

  • 플래시의 onEnterFrame과 같은 게임루프 구현은 가급적 인터벌을 0으로 줘서 실버라이트 런타임에게 맡기고 렌더링을 수행할 것.
  • FPS의 조절은 가급적 MaxFramerate 속성을 설정하여 시스템 전체적으로 조절할 것.

P.S.
자세한 내막에 대한 정보가 있으시면 제보 바랍니다.

저작자 표시 동일 조건 변경 허락
신고
Posted by gongdo


티스토리 툴바