我在一个简单的WPF动画中测量帧之间的时间.穿孔器说该应用程序的执行速度约为60fps,因此我预计帧之间的时间约为16.6ms,偏差很小.
public MainWindow()
{
...
CompositionTarget.Rendering += Rendering;
}
List<long> FrameDurations = new List<long>();
private long PreviousFrameTime = 0;
private void Rendering(object o, EventArgs args)
{
FrameDurations.Add(DateTime.Now.Ticks - PreviousFrameTime);
PreviousFrameTime = DateTime.Now.Ticks;
}
Run Code Online (Sandbox Code Playgroud)
有两件事让我惊讶:

Y - 以滴答为单位的帧之间的时间(10,000滴答= 1ms)
X - 帧计数
可能的混杂因素
我正在使用的项目:SimpleWindow.zip
===编辑
Markus指出我可以使用RenderingEventArgs.RenderingTime.Ticks而不是DateTime.Now.Ticks.我重复了这次跑步并得到了截然不同的结果.唯一的区别是计时方法:
DateTime.Now.Ticks

RenderingEventArgs.RenderingTime.Ticks

来自RenderingEventArgs的数据产生的数据更接近预期的16.6ms /帧,并且它是一致的.
如果显示器每16.6ms更新一次并且WPF每14.9ms更新一次,我们可以预期会出现导致撕裂的竞争条件.也就是说,当显示器试图读取图像时,大约每第10帧WPF将尝试写入其图像.