相关疑难解决方法(0)

Wpf动画最佳实践

我正在寻找有关WPF动画的最佳实践或指南.特别是有关性能考虑的信息

wpf performance animation

27
推荐指数
1
解决办法
9081
查看次数

为什么WPF中的帧率不规则且不限于监视刷新?

我在一个简单的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)

有两件事让我惊讶:

  • 帧之间的时间相当不规则
  • 帧之间的时间约为8毫秒.我曾预料到显示器的刷新率会设置帧之间的时间下限(即每帧之间60Hz = 16.6ms,任何更快的都没有意义).

DefaultFrameRate

Y - 以滴答为单位的帧之间的时间(10,000滴答= 1ms)
X - 帧计数

可能的混杂因素

  • 定时器不准确
  • 如果CompositionTarget.Rendering实际上与单个帧的绘制无关

我正在使用的项目:SimpleWindow.zip

===编辑

Markus指出我可以使用RenderingEventArgs.RenderingTime.Ticks而不是DateTime.Now.Ticks.我重复了这次跑步并得到了截然不同的结果.唯一的区别是计时方法:

DateTime.Now.Ticks

DefaultFrameRate

RenderingEventArgs.RenderingTime.Ticks

在此输入图像描述

来自RenderingEventArgs的数据产生的数据更接近预期的16.6ms /帧,并且它是一致的.

  • 我不确定为什么DateTime.Now和RenderingEventArgs会产生如此不同的数据.
  • 假设RenderingEventArgs正在产生正确的时间,那么这些时间不是预期的16.6ms仍然有点令人不安.

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

wpf animation

20
推荐指数
2
解决办法
8702
查看次数

标签 统计

animation ×2

wpf ×2

performance ×1