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

试图确定C#WPF程序中的FPS,c#,wpf,frame-rate,C#,Wpf,Frame Rate,我正在使用WPF和C为a编写一个应用程序。(而且,我对WPF一点也不太熟悉。)我们怀疑我们没有从API“请求”到帧速率,所以我尝试编写自己的FPS计算器。我知道根据内部时钟计算它的数学,只是不知道如何在Windows/WPF API中访问计时器 我需要什么库/命令才能访问计时器?我想您正在寻找。只需初始化它,并在每次迭代开始时重置它。在迭代结束时,进行计算。尽管您可以使用Dispatchermer(将其标记整理到ui线程上,导致相关性问题)或System.Threading.Timer(如果您尝

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


我需要什么库/命令才能访问计时器?

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

尽管您可以使用Dispatchermer(将其标记整理到ui线程上,导致相关性问题)或System.Threading.Timer(如果您尝试触摸任何ui控件,可能会引发异常),我建议您只使用:)

您可以使用p/Invoke来包装通常调用的win32计时调用(例如
QueryPerformanceCounter
),也可以使用.NET中已经包装好的东西

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


如果您想要在许多系统上可重用的东西,而不是简单的诊断,请注意与处理器相关的问题w/QPC和秒表。查看此问题:

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

这可能比你自己写要简单

另外,您究竟是如何“请求”帧速率的?您使用的是什么API?您正在使用时间线的DesiredFrameRate属性吗?如果是这样,这通常用于降低帧速率而不是提高帧速率。(文档中还提到提高帧速率以避免撕裂,但这并没有真正的意义-撕裂是由于显示的帧与监视器不同步造成的,并且不是缓慢帧速率的产物。在任何情况下,在Vista或Windows 7上,启用DWM时都不会撕裂。)这只是一个提示,而且WPF不承诺匹配建议的帧速率

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


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

秒表成功了。我只需在应用程序中跟踪ElapsedMills,无需停止/启动每个刻度。请问,使用秒表计算FPS的数学是什么?