从高度动态的C 数据模型中更新QML:计时器与属性绑定

Updating QML from highly dynamic C++ data model: Timer vs Property binding

本文关键字:QML 计时器 绑定 属性 更新 动态 高度 数据模型      更新时间:2023-10-16

假设一个C 业务模型,该模型可能会很快更改其基础数据(例如,最多高达1000 Hz)。在我的具体情况下,这将是围绕网络数据回调机制(更精确的Ros-Subscriber)包装,以其自己的线程运行。将数据视为一些传感器读数。进一步假设我们正在处理简单的数据,例如在最坏情况下一个双重值或字符串。

在QML组件中可视化此类数据的最佳方法是什么?最好的是,在资源方面保持温和,最大程度地减少模型状态和视图之间的延迟,并尽可能干净?

我提出了以下选项:

  1. 将数据作为模型的属性绑定到视图中,并在每个更新的数据上发出datachanged()信号:

    • pro:优雅的代码,在数据更新速率较低的情况下,资源使用最低。
    • con:高信号频率将垃圾邮件垃圾邮件并最大化资源利用率,可能会使系统无响应。
  2. 使用QML -Timer并以特定的间隔进行轮询模型(例如10-60 Hz):

    • Pro:资源利用率的上限,稳定利率
    • con:计时器本身消耗资源;不像数据绑定那么优雅;如果数据生成/回调率低于计时器率,则必须进行不必要的民意调查。
  3. 使用数据绑定如1所示。但是使用QTimer(或其他计时器(如BOOST))在C 模型内的信号发射频率,即仅在特定的间隔内发射datachanged()信号:

    • pro:与2相同。
    • con:与2。
    • 相同
  4. 组合来自3的计时器。通过某种检查数据是否实际更改,在发出信号之前是否实际更改,因此如果数据没有更改,则避免了不必要的信号:

    • pro:与3相同。
    • con:与3相同。但甚至不那么优雅;诱发错误的风险增加,因为逻辑更为复杂;模型很难重复使用,因为数据更改检查很大程度上取决于数据的性质

我是否错过了一个选项(除了首先没有产生这么多数据)吗?您的选择是什么或最大的QT/QML实现这一目标?

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

我的意思是被授予,每秒1000个更新足够,但是这可能会强制GUI更新每秒1000倍吗?还是GUI仅在渲染新框架时才更新?任何远程理智的GUI框架都可以正是这样。即使您的数据每秒更改了Gazzilion时间,GUI更改也只会以GUI呈现的帧速率反映。

话虽如此,您可以努力减少后端的压力。典型的"便利性"实现将负担系统的负担,即使QT支持的任何当代平台都可以处理1000 Hz的一个或两个物体,如果有很多,那么您也应该努力减少它。而且,即使对系统性能不利,效率也总是良好的,只要它的成本开发太高。

我不建议使用属性或模型接口直接更新数据,因为这会充斥信号通知。您应该在低级别上静静地处理基础数据更新,仅定期告知更改的属性或模型接口。

如果您的更新是连续的,只需设置一个计时器,30 Hz甚至更少的OUTTA就可以了。

如果不是,则可以使用"脏"标志。当数据更改时,设置标志并启动更新计时器作为单次拍摄,当计时器触发并通知更新时,它会清除标志并悬挂。这样,您可以避免运行计时器而无需任何更新。