http://cafe.naver.com/mssilverlight/3021에 니르워프님이 결정적인 정보와 함께 실험 설계의 문제점도 짚어주셨어요.

[이슈1] 상이한 측정 결과

제 컴에서 공도님의 소스를 받아서 실행을 해본바, 이슈1일때 공도님의 블로그에서 보여 지는 그런식의 결과는 없다라는 것입니다. MaxFramerate의 설정과 무관하게, 주어진 인터벌로 나옴.

16ms의 인터벌을 주면, MaxFramerate의 설정에 따라 MaxFramerate만큼으로 제한되는 프레임 레이트를 출력하는것이 공도님의 블로그에 올려져 있으나 저의 측정에서는 모두 16ms에 해당하는 프레임 레이트로 나옴.

소스 분석해본바, 공도님의 방법은 MaxFramerate과의 연관성이 파악하는 방법이 아니어보이네요.

[이슈2]

적절치 않는 계산 방법을 사용하고 있습니다.

하나의 인터벌이 지나면(완료되면) 한개의 카운팅을 하는 방법을 취하고 있고, 인터벌이 완료되었을때 할당된 시간이 초과되었는지를 점검하는데, 이 방법으로 하면, 할당 시간보다 조금더 지나칩니다. 인터벌이 클수록 지나치는 크기는 더 커질수 있습니다.

인터벌이 50이라면 49이상의 오차도 나올 수 있습니다.

일단 이슈2를 해결하기 위해 코드를 다음과 같이 약간 수정했고요,

private readonly int LoopCount = 100;

void onTime(object sender, EventArgs e)

{

    if (++_count == LoopCount)

    {

        TimeSpan elapsed = DateTime.Now - _beginTime;

        StopStoryboard();

        StopTimer();

        outputText.Text = string.Format("{0} FPS", ((LoopCount / elapsed.TotalMilliseconds) * 1000).ToString("0.00"));

    }

}

작동 완구와 소스는 아래... 또는 여기에서 테스트. http://shiverlight.net/Sample/GameLoopTest/




문제는 결과에 큰 차이가 없다는 점이에요.

이렇게 되면 짐작해 볼 수 있는 건 현재 운영체제의 버전이나 개별 상황에 따라 실버라이트 런타임이 제공하는 타이머의 안정도나 정확도가 떨어질 수 있느냐의 문제인데요, 각자 테스트 조건을 다르게 해서 특이할 만한 사항이 있으면 알려주시길 바래요.

제 조건은 아래와 같아요.

OS : Vista Enterprise SP1
CPU : Core2Duo 1.4GHz
GPU : Intel GMA950
Browser : IE7, FF3

OS와 브라우저, CPU, GPU외에 영향을 줄 만한 요소는 없을 거라고 생각하고요. 램이야 남을 만큼 남아 있으니^^;;

어쨌거나, 좋은 조언을 해주신 니르워프님께 감사드려요 :)

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

결론부터 얘기하자면 스토리보드든 타이머든 정밀도는 서로 같았으며, 양쪽다 타이머의 최소 인터벌에 따라 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


티스토리 툴바