试图在C#WPF程序中确定FPS

时间:2010-11-10 22:53:24

标签: c# wpf frame-rate

我正在使用WPF和C#编写touch table的应用程序。 (而且,我对WPF并不十分熟悉。完全没有。)我们怀疑我们没有从API中“请求”获得帧速率,因此我正在尝试编写自己的FPS计算器。我知道基于内部时钟计算它的数学,我只是不知道如何在Windows / WPF API中访问计时器。

访问计时器需要哪些库/命令?

4 个答案:

答案 0 :(得分:5)

虽然您可以使用DispatcherTimer(它将其标记编组到ui线程上,导致相关性问题)或System.Threading.Timer(如果您尝试触摸任何UI控件可能会抛出异常),我会建议你只使用WPF profiling tools:)

答案 1 :(得分:3)

首先,您是否知道Microsoft提供了一个免费的诊断工具,可以告诉您WPF更新屏幕的帧速率?我想如果你不相信你得到了你要求的帧率,那么也许你可能不相信它,但我发现它是一个可靠的工具。它被称为Perforator,它是WPF Performance Suite的一部分,您可以按照此处的说明获取它:http://msdn.microsoft.com/library/aa969767

这可能比编写自己的更简单。

另外,您究竟是如何“请求”帧速率的?您使用的API是什么?您使用的是Timeline的DesiredFrameRate属性吗?如果是这样,这通常用于降低帧速率而不是增加帧速率。 (文档还谈到提高帧速率以避免撕裂,但这并没有多大意义 - 撕裂是由于显示帧与监视器不同步造成的,并且不是帧速率慢的伪像。无论如何。在Vista或Windows 7上,你不会在启用DWM时撕裂。)这只是一个提示,WPF不承诺与建议的帧速率匹配。

对于测量技术,您可以采用多种方式。如果你只想弄清楚帧速率是否在正确的球场,你可以每帧增加一次计数器(你通常在CompositionTarget.Rendering的事件处理程序中做),并设置DispatcherTimer每秒触发一次,并让它在UI中显示值,然后重置计数器。由于DispatcherTimer并不完全准确,所以它会有些粗糙和准备好,但它会告诉你,当你期望30fps时,你是否有15fps。

如果您正在尝试获得更精确的视图(例如,您想要尝试确定帧是否经常渲染,或者您似乎偶尔会丢失帧),那么这会得到一个有点复杂。但是我会等着看Perforator是否会为你提供更多建议。

答案 2 :(得分:2)

我认为你正在寻找StopWatch。只需初始化它并在每次迭代开始时重置它。在迭代结束时,进行计算。

答案 3 :(得分:0)

你想要包装你通常调用的win32时序调用(例如QueryPerformanceCounter),使用p / Invoke,或者使用已经包装它们的.NET。

你可以使用DateTime.Ticks,但它的分辨率可能不够高。 Stopwatch类使用QueryPerformanceCounter。

如果您想要在许多系统上重复使用的东西,而不是简单的诊断,请注意与QPC和秒表有关的处理器相关问题。请参阅此问题:Can the .NET Stopwatch class be THIS terrible?