【问题标题】:WPF: Updating Polyline's Points property via binding causes lagWPF:通过绑定更新折线的 Points 属性会导致延迟
【发布时间】:2016-05-11 09:52:16
【问题描述】:

我有一个自定义图形控件,它使用Polyline 对象来呈现波形。

<Polyline Name="Line" Points="{Binding LinePoints}"
    Stroke="{Binding LineColor}"
    StrokeThickness="{Binding LineThickness}">

在我的 ViewModel 中,我将通过 DispatcherTimer 每隔一段时间(50-200 毫秒)生成不同的“LinePoints”集。绑定工作得很好,我在视图中得到了动画波形,除了它在用户界面中造成了明显的延迟。例如,当我右键单击 Window 中的其他内容时,上下文菜单会出现非常非常滞后的动画。

当然,我可以将计时器更改为每 500 毫秒计时一次,这样延迟就会大大减少。但是,这会使我的图表看起来很草率。有什么方法可以将其中一些转移到另一个线程?

(旁注:LinePoints的生成不是导致延迟的主要原因。每一代使用大约1ms的执行时间。这个值是从System.Diagnostics.Stopwatch获得的)

【问题讨论】:

  • 你怎么知道什么时候应该更新你的折线控件?应用程序中的哪些操作告诉您更新它?在我要去的地方,我相信您使用错误的方法来解决您的问题。
  • 折线只是简单地模拟一个图形的波形,这个波形预计会非常频繁地移动和变化。
  • 你提到了波形,所以它应该随着声音参数的变化而更新?
  • 它只是在波形变化时更新。波形可以来自声音或任何东西。但预计它会非常频繁地变化。目前,我正在通过一个函数在 100 毫秒内生成数千个 Points 来模拟它。
  • 或者更确切地说,一个生成器函数,通过计时器每 100 毫秒调用一次。

标签: c# wpf multithreading rendering lag


【解决方案1】:

因此,由于计算所有必需点的操作在 UI 上很繁重,您应该使用额外的 Thread 来覆盖计算。 UI Thread 应该只负责表示,这意味着它应该只分配给定的值,而不是计算它。

这是 4.5 框架版本中引入的新 await async keywords 的完美用例。

为了实现所描述的行为,我建议使用Task class

private async void InvokeHandler()
{
   while(true)
   {
       // Passes variable to calculation method and waits for result without blocking.
       ViewModel.Points = await Task.Run(() => CalculatePoints(new object()));
       await Task.Delay(100);
   }
}
private Task<PointCollection> CalculatePoints(object requiredArguments)
{
    var points = new PointCollection();
    // Do calculations here with requiredArgument passed from a caller.
    return Task.FromResult(points);
}

它是如何工作的?InvokeHandler 方法中,您启动了一个Task,它本质上可能是另一个Thread(如果当前的Thread 不够,则从ThreadPool 收集要运行的资源提供了Delegate),它不会阻止您当前正在运行的Thread,并且在它完成执行后会返回一个结果(PointCollection)。

【讨论】:

  • 好吧,在我阅读更多关于这个主题的内容后,我可以试试这个。但这可能不是主要原因,因为计算方法每次计算只需要大约 1ms。我认为 100 毫秒渲染周期内的 1 毫秒非表示执行时间不应导致延迟。
  • @Jai 如果延迟纯粹是由实际折线的渲染引起的。那么实际上减少当时传递的点数或改进硬件的选择很少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 2013-06-11
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2013-08-16
  • 2011-05-08
相关资源
最近更新 更多