我正在测量一个简单的WPF动画帧之间的时间。穿孔器说应用程序的执行速度为〜60fps,所以我预计帧之间的时间约为16.6ms,而且几乎没有偏差。为什么WPF中的帧频不规则并不限制显示器刷新?
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;
}
有两件事情让我很吃惊:帧之间
- 时间相当不规则
- 帧之间的时间是8ms的〜。我本来期望显示器的刷新速率会在帧之间设定一个较低的时间限制(即每帧之间60Hz = 16.6ms,而任何速度都是毫无意义的)。
Ÿ - 帧计数
可能的混杂因素
- 定时误差
- 如果CompositionTarget - 在蜱框架(10,000蜱= 1毫秒)
X之间的时间。渲染实际上并不涉及单个框架的绘制
我使用的项目:马库斯指出,我可以用RenderingEventArgs.RenderingTime.Ticks代替DateTime.Now.Ticks SimpleWindow.zip
===编辑
。我重复了跑步,得到了非常不同的结果。唯一的区别是定时方法:
DateTime.Now.Ticks
RenderingEventArgs.RenderingTime.Ticks
数据从RenderingEventArgs产生的数据更接近预计16.6ms /帧,并且是一致的。
- 我不知道为什么DateTime.Now和RenderingEventArgs会产生这样非常不同的数据。
- 假设RenderingEventArgs正在产生正确的时间,那些时间不是预期的16.6ms仍然有点令人不安。
如果显示屏每16.6ms更新一次并且WPF每14.9ms更新一次,那么我们可以预料到一个竞争条件会导致撕裂。也就是说,当显示器试图读取图像时,大约每10帧WPF都会尝试写入图像。
秒表类是去避免计时器误差 – 2011-04-28 01:12:30
这种“可能”是有益的方式:http://rhnatiuk.wordpress.com/2008/12/21/wpf-video-playback-problems/ - 我不确定这个问题有多相关,但我认为它今天仍然存在。 – 2011-04-28 07:03:53
@Tristan @Martin时间测量根本不需要!你可以[将EventArgs转换为RenderingEventArgs来获取RenderTime](http://msdn.microsoft.com/en-us/library/system.windows.media.compositiontarget.shipping(VS.95).aspx) – 2011-04-28 10:32:54