2013-10-28 4 views
0

정확한, 아주 작은 시간 간격을 위해 화면에 무엇인가를 보여줄 필요가 있습니다. 고정 된 (그리고이 작업을 위해 비교적 느린) 재생 빈도로 작동하는 모니터로 작업하는 것이 제한 요소가 될 것입니다. 사용자가 디스플레이 시간을 "프레임"(= 16, (6) 60Hz 모니터의 경우 ms).C# .Net은 얼마나 많은 모니터 프레임이 보여 졌는지 알거나 설정된 프레임 수만큼 화면에 무언가를 보여줄 수있는 방법이 있습니까?

원래는 정확한 타이머 (스톱워치 클래스에 기반 함)를 사용했지만, 실제로 얼마나 많은 프레임이 실제로 보여 졌는지를 알 수있는 방법이 없습니다. 즉, 21ms의 경우, 실제로 2 프레임 (33,3ms) 동안 표시 될 확률이 25 %이며 1 프레임 (16,6ms)에 대해 표시 될 확률이 75 %입니다. 새로 고침하는 방법에 따라 16,6ms 간격은 21ms 간격으로 맞 춥니 다.

나는 directx/opengl/etc의 Vsync를 사용하여이 작업을 수행 할 수 있지만 가능한 경우 간단한 Windows 양식을 사용하고 싶습니다. 그래서, 얼마 동안 여러 프레임이 보여 졌는지 알아 내거나, 모니터에 그려진 새로운 프레임의 이벤트를 가로 채거나 수동으로 프레임 다시 그리기를 주문하는 방법이 있습니까?

답변

0

"모니터 프레임"이 무슨 뜻인지는 분명하지 않습니다.

모니터 재생 빈도를 측정하려면 측정 할 항목이 많지 않습니다. 모니터 모델 및 디스플레이 설정에 따라 정해진 숫자입니다. 찾아 보거나 win API 호출을 사용하여 프로그래밍 방식으로 얻을 수 있습니다 : http://msdn.microsoft.com/en-us/library/dd162611%28v=VS.85%29.aspx. Refrash 속도는 소프트웨어에 의해 영향을받지 않습니다.

fps를 측정하려면 타이머 (예 : StopWatch)와 프레임 수가 필요합니다. 후자는 화면을 새로 고칠 때마다 변수를 하나씩 증가시킴으로써 얻을 수 있습니다. 귀하의 양식에 OnPaint 방법은 아마도 당신이 그것을 할 수있는 장소 중 하나입니다. Fps는 모니터의 영향을받지 않습니다 (VSync를 활성화하지 않은 경우).

느린 재생 빈도로 인해 건너 뛴 프레임을 제외하고 fps를 측정하려는 경우 ... 재생률이 fps보다 낮 으면이 값이 재생 빈도와 같고 안전하다고 가정합니다. fps는 새로 고침 속도가 fps보다 높은 경우입니다.

+0

정확히 얼마나 많은 모니터 프레임이 표시되었는지 알고 싶습니다. T = 0ms에서 폼에 X를 칠한 다음, Thead.Spin()을 20ms가 경과 할 때까지 (StopWatch에서) 상상해보십시오. t = 20ms에서 폼을 지 웁니다. 사실, 프로그램의 사용자 (전형적인 60Hz 디스플레이가있는 경우)는 20ms 동안 X를 보지 못했습니다. 그는 16, (6) ms 또는 33, (3) ms 동안 그것을 보았습니다. 디스플레이가 자신의 OnPaint 또는 w/e와 독립적으로 코드 자체를 새로 고칩니다. 그게 - 사용자가 얼마나 오랫동안 이미지를 보았는지 - 제가 알아야 할 것입니다. – Istrebitel