【问题标题】:Trying to determine FPS in a C# WPF program尝试在 C# WPF 程序中确定 FPS
【发布时间】:2010-11-10 22:53:24
【问题描述】:

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

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

【问题讨论】:

    标签: c# wpf frame-rate


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 秒表成功了。我只是在应用程序期间跟踪 ElapsedMilliseconds - 无需停止/启动每个滴答声。
      • 请问使用秒表计算 FPS 的数学公式是什么?
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          • 1970-01-01
          • 2016-10-26
          相关资源
          最近更新 更多