制作动画更顺畅

时间:2014-02-04 23:02:18

标签: c# wpf storyboard

我的WPF程序的故事板动画口吃破坏了用户体验(例如,在ObservableCollection和ListBox中添加更多项目正在更新)。

我的想法是通过以更高的优先级调度动画来使动画更顺畅,所以我尝试了

Storyboard sb = new Storyboard();
 //all animations
this.Dispatcher.Invoke(()  =>
    { sb.Begin(); 

    }, System.Windows.Threading.DispatcherPriority.Send);

我认为“发送”作为最高优先级和“SystemIdle”之间存在差异,但是没有。

我希望我对调度程序的理解存在小问题,并且有一个简单的解决方法,但我对改进动画性能的任何想法持开放态度。

修改

  1. 在每个动画控件上实现RenderTargetBitmap,它在动画开始时截取屏幕截图并用一个图像控件替换复杂的可视树,并在动画完成时将其切换回来
  2. 使用SystemIdle优先级
  3. 填充在Dispatcher中废弃我的动画的列表框
  4. 将帧率设置为30
  5. 在perfmon中检查过,似乎没有任何软件呈现,RenderTier为2
  6. 如果我完全禁用填充列表框,一切运行顺利

    列表框的填充方式如下

    Task.Factory.StartNew(() =>
    {
      List<MyData> _f = new List<MyData>();
      //populate _f
      Dispatcher.BeginInvoke(new Action(() => {
        _MyCollection.Clear();
        _MyCollection.AddRange(_f); //Adding items without raising events *
      }), DispatcherPriority.SystemIdle);
    }
    

    *我甚至从ObservableCollection : calling OnCollectionChanged with multiple new items

    使用addRange for ObservableCollection

0 个答案:

没有答案