4

我正在使用 WPF 和 C#为触摸表编写应用程序。(而且,我对 WPF 并不是很熟悉。一点也不。)我们怀疑我们没有从 API 中“请求”得到帧速率,所以我正在尝试编写自己的 FPS 计算器。我知道根据内部时钟计算它的数学,我只是不知道如何访问 Windows/WPF API 中的计时器。

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

4

4 回答 4

5

尽管您可以使用 DispatcherTimer (将其滴答声编组到 ui 线程上,从而导致相对性问题)或 System.Threading.Timer (如果您尝试触摸任何 UI 控件可能会引发异常),我建议您只是使用WPF 分析工具:)

于 2010-11-10T23:02:27.267 回答
3

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

于 2010-11-10T23:00:01.103 回答
3

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

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

另外,您究竟是如何“请求”帧速率的?您使用的是什么 API?您是否使用时间轴的 DesiredFrameRate 属性?如果是这样,这更常用于降低帧速率而不是增加它。(文档还谈到了提高帧速率以避免撕裂,但这并没有真正的意义 - 撕裂是由与显示器不同步的帧引起的,并且不是低帧速率的伪影。无论如何,在 Vista 或 Windows 7 上,您不会在启用 DWM 的情况下感到撕裂。)这只是一个提示,WPF 不承诺匹配建议的帧速率。

至于测量技术,您可以采用多种方法。如果您只是想确定帧速率是否在正确的范围内,您可以每帧增加一次计数器(通常在事件处理程序中为 执行此操作CompositionTarget.Rendering),并设置 DispatcherTimer 触发一次一秒钟,让它在 UI 中显示值,然后重置计数器。它会有点粗糙和准备好,因为DispatcherTimer并不完全准确,但它会告诉你,例如,当你期望 30fps 时,你是否有 15fps。

如果您想获得更精确的视图(例如,您想尝试确定是否不断渲染帧,或者您似乎不时丢失帧),那么这会变得更复杂一些. 但在提出更多建议之前,我会等着看 Perforator 是否能帮到你。

于 2010-11-10T23:25:16.293 回答
0

您想通过使用 p/Invoke 来包装您通常调用的 win32 计时调用(例如QueryPerformanceCounter),或者使用 .NET 中已经包装它们的东西。

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

如果您想要在许多系统上可重用的东西,而不是简单的诊断,请注意与 QPC 和秒表有关的处理器相关问题。看到这个问题:.NET 秒表类可以这么可怕吗?

于 2010-11-10T23:02:34.287 回答