因此,我在Qt应用程序中使用了QQuickFramebufferObject
和QQuickFramebufferObject::Renderer
。如here所述:
为避免争用情况和两个线程的读/写问题,重要的是渲染器和项目永远不要读或写共享变量。项目和渲染器之间的通信主要应该通过QQuickFramebufferObject :: Renderer :: synchronize()函数进行。
因此,我必须同步调用QQuickFramebufferObject::Renderer::synchronize()
时呈现的所有数据。但是,由于很多时候发送到渲染线程的数据可能很大,所以我想避免复制该数据(存储在DataObject
中),所以现在我要传递一个{{1} },并将其分配给我的std::shared_ptr<DataObject>
类的私有成员。这种方法效果很好,但是我不确定这是否是“正确”的处理方式。为了在GUI线程和渲染线程之间共享/传输数据,我可以采取什么方法?
答案 0 :(得分:0)
对于太大而无法在syncnize()方法中复制的数据,请使用同步对象来管理对数据的访问。写入时将其锁定,完成时将其释放,渲染时将其锁定并直接访问数据。只要一次只有一个线程访问数据,您就可以安全。
同步对象被锁定的时间越长,跳帧的风险就会增加。锁定写入时间超过最佳渲染范围的一半(8.5毫秒=〜16.7毫秒/ 2)会导致丢帧,但是您的应用程序中发生的事件可能更多,因此实际数字会更低。
或者,您可以对具有受保护的索引变量的大型数据结构使用循环缓冲区,以便您可以同时写入一个结构,同时读取另一个结构。准备好显示所有数据并调用QQuickItem :: update()时,增加索引变量。