首页 文章

从高度动态的C数据模型更新QML:Timer与Property绑定

提问于
浏览
1

假设C业务模型可能非常快速地改变其基础数据(假设高达1000 Hz) . 在我的具体情况下,这将是一个在自己的线程中运行的网络数据回调机制(更精确的ROS用户)的包装器 . 将数据视为一些传感器读数 . 进一步假设我们正在处理简单的数据,例如单个双精度值或最坏情况下的字符串 .

What would be the best way to visualize such data in a QML component? Best here is with respect to being gentle with resources, minimizing the delay between model state and view, and being as clean code as possible?

我想出了以下选项:

  • 将数据作为模型的属性绑定到视图,并在每次更新数据时发出dataChanged()信号:

  • Pro:优化代码,在数据更新率较低的情况下资源使用率最低 .

  • Con:高信号频率会使GUI发送垃圾邮件并最大限度地提高资源利用率,从而可能导致系统无响应 .

  • 使用QML-Timer并以特定间隔(例如10 - 60 Hz)轮询模型:

  • Pro:资源利用率上限,稳定利率

  • Con:Timer本身消耗资源;不如数据绑定那么优雅;如果数据生成/回叫速率低于定时器速率,则必须进行不必要的轮询调用 .

  • 使用数据绑定,如1.但使用QTimer(或其他定时器,如boost)限制C模型内的信号发射频率,即仅以特定间隔发出dataChanged()信号:

  • Pro:与2相同 .

  • Con:与2相同 .

  • 在3.发出信号之前,通过某种方式检查数据是否实际发生变化,从而避免在数据未发生变化时不必要的信号发射:

  • Pro:与3相同 .

  • Con:与3.相同,但更不优雅;由于逻辑更复杂,导致错误的风险增加;模型更难以重用,因为数据变化检查高度依赖于数据的性质

我是否错过了一个选项(除了首先没有产生如此多的数据)?你会选择什么或最QT / QML的方式来实现这个目标?

1 回答

  • 2

    首先,您是否已确定存在性能问题?

    我的意思是授予,每秒1000次更新是充足的,但是这可能会强制GUI更新每秒1000次吗?或者GUI可能只在呈现新帧时更新?任何远程理智的GUI框架就是这样 . 即使您的数据每秒更改一次Gazzilion次数,GUI更改也只会以GUI渲染的帧速率反映出来 .

    话虽这么说,你可以努力减少后端的压力 . 典型的“便利”实现会给系统带来负担,即使Qt支持的任何现代平台可以为一个或两个对象处理1000 Hz,如果这些很多,那么你应该努力减少它 . 即使不直接损害系统性能,只要不以过高的成本开发方式实现,效率总是很好 .

    我不建议使用属性或模型接口直接更新数据,因为这会泛滥信号通知 . 您应该在低级别静默处理基础数据更新,并且只定期通知属性或模型接口更改 .

    如果您的更新是连续的,只需设置一个定时器,如果人正在看它,30赫兹甚至更低 .

    如果不是,您可以使用“脏”标志 . 当数据发生变化时,设置标志并以单次启动更新计时器,当计时器触发并通知更新时,它会清除标志并暂停 . 这样就可以避免在没有任何更新的情况下运行计时器 .

相关问题