2017-09-13 36 views
0

我目前正在为UWP(windows IoT核心)编写一个kiosk风格的应用程序,以用于嵌入式设备(例如pi3等)。页面的多个UI线程(加速缓慢的个别控件)

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

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

所以我的问题总结:有没有什么办法让图表分别在不同的UI线程中呈现(并因此分布在其他内核中)?

[稍后更新] 看起来像新的胜利物联网发布有点快,以及更新的图表组件。

+0

这很难,没有看到你的应用程序是如何写的说,但一个可能性是,该UI是所有这些其他后台线程经常更新?那么排队更新的可能性以及是否按照计划的基础更新UI,比如每个.1或.5秒?如果你的UI线程有很多事情发生,你可能会遭受太多的上下文切换。 – cost

+0

我试着从不同的线程本身进行更新并使用您的方法。到目前为止,在使用Dispatcher.Runasync优先级设置方面似乎没有多大区别。而且我还必须添加更多图表。 – user2921878

+0

您的图表是否每次都完全重新绘制,或者只是其中的一小部分? – cost

回答

0

不能严格讲UWP,但从我的WPF有多个UI线程的经验是一个麻烦,你应该尽可能避免(不要说他们介绍的限制)。

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

+0

传感器轮询只有每200-500毫秒。即使采用更快的轮询速度,传感器本身也几乎不占用CPU时间。它的4+图表每500毫秒重新绘制UI线程上的所有CPU时间。我可以放慢速度,但是离经验还有点距离。还有更多图表来临。如果我可以在其他CPU核心上涂抹这些内核,而这些内核目前什么都不做,这会有所帮助。 – user2921878

+0

您对图表使用什么样的控件?你能够发布你更新底层数据的任何代码吗? –

+0

Im使用此Telerik图表控件。 http://docs.telerik.com/windows-universal/controls/radchart/getting-started。基本上它是一个具有25个新传感器值的数组,使用Dispatcher.RunAsync从后台线程每隔500ms分配给DataContext属性(如该页面的示例中)。相当标准。 – user2921878