【问题标题】:Multiple UI threads for page (speed up slow individual controls)页面的多个 UI 线程(加速缓慢的单个控件)
【发布时间】:2018-01-22 04:05:03
【问题描述】:

我目前正在用 UWP(Windows IoT Core)编写一个信息亭风格的应用程序,用于嵌入式设备(例如 pi3 等)。

该设备有多个传感器,它们在应用程序的单个屏幕中实时输出到各种图形/图表中,但我遇到了性能问题。传感器是在单独的线程中读取的(使用 Task.Run() => {}),但经过分析,这似乎根本不会花费太多 cpu 时间。 似乎更新图表需要太多时间,而且这并没有分布在核心上,因为只有一个 UI 线程。 CPU 使用率没有超过 25%,UI 响应速度变慢。

我尝试了一些优化(例如减少数据点的数量等),这有帮助,但还不够。也许那里有更快的图表组件(目前使用 Telerik uwp 组件),但我正在寻找另一种方法。

所以我的问题的总结:有没有办法让每个图表在单独的 UI 线程中呈现(因此在某种程度上分布在其他内核上)?

[稍后更新] 似乎新的 win IoT 版本更快一些,以及更新的图表组件。

【问题讨论】:

  • 如果不了解您的应用程序是如何编写的,这很难说,但一种可能性可能是所有这些其他后台线程过于频繁地更新 UI?排队更新和按计划更新 UI 的可能性如何,比如每 0.1 或 0.5 秒?如果你的 UI 线程上发生了很多事情,你可能会遇到太多的上下文切换。
  • 我已经尝试从不同的线程本身进行更新并使用您的方法。到目前为止,在使用上似乎没有太大的区别,同时调整了 Dispatcher.Runasync 优先级设置。我什至必须添加更多图表。
  • 您的图表是每次都完全重绘,还是只重绘一部分?
  • 嗯,每个循环的每个数据点都会发生变化,所以我刷新了整个绑定的数据上下文,是的。到目前为止真的找不到解决方法。
  • 你能展示你的代码示例吗?

标签: c# multithreading uwp raspberry-pi3 windows-iot-core-10


【解决方案1】:

不能严格地说 UWP,但根据我的 WPF 具有多个 UI 线程的经验,您应该尽可能避免这种麻烦(更不用说它们引入的限制)。

在处理您的传感器数据时,您会查看什么样的轮询率?许多传感器的数据速率远远超过向用户显示的有用数据,是否可以让您的工作线程计算更大时间范围内的平均值并用它填充您的图表?我怀疑您的用户是否会从每秒更新 20 次以上中获益良多。

【讨论】:

  • 传感器仅每隔 200-500 毫秒轮询一次。即使轮询速度更快,传感器本身也几乎不会占用任何 CPU 时间。它的 4+ 图表每 500 毫秒重绘一次,占用了 UI 线程上的所有 CPU 时间。我可以放慢速度,但这会影响体验。还有更多图表即将推出。如果我可以将它们涂抹在其他 CPU 内核上,这些内核目前什么都不做,这会有所帮助。
  • 您对图表使用什么控件?您可以发布更新基础数据的任何代码吗?
  • 我正在使用这个 Telerik 图表控件。 docs.telerik.com/windows-universal/controls/radchart/…。基本上,它是一个包含 25 个新传感器值的数组,我使用 Dispatcher.RunAsync 每 500 毫秒从后台线程分配给 DataContext 属性(如该页面的示例中)。相当标准。
【解决方案2】:

您也可以使用任务更新图表,只需记住在其中使用调度程序,因为从非 UI 线程更改 UI 是非法的。

欲了解更多信息,请查看:

https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/keep-the-ui-thread-responsive

https://docs.microsoft.com/en-us/uwp/api/windows.ui.core.coredispatcher

【讨论】:

    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多