使用QQuickFramebufferObject时同步数据的最佳方式是什么

What is the best way to synchronize data when using QQuickFramebufferObject?

本文关键字:最佳 方式 是什么 数据 QQuickFramebufferObject 同步 使用      更新时间:2023-10-16

所以我在Qt应用程序中使用QQuickFramebufferObjectQQuickFramebufferObject::Renderer。如前所述:

为了避免竞争条件和两个线程的读/写问题,重要的是渲染器和项永远不要读或写共享变量。项目和渲染器之间的通信应该主要通过QQuickFramebufferObject::renderer::synchronize((函数进行。

因此,当调用QQuickFramebufferObject::Renderer::synchronize()时,我必须同步我渲染的任何数据。但是,因为很多时候发送到渲染线程的数据可能非常大,所以我希望避免复制该数据(存储在DataObject中(,所以现在我在函数中传递一个std::shared_ptr<DataObject>,并将其分配给QQuickFramebufferObject::Renderer类的一个私有成员。这种方法效果很好,但我不确定这是否是";正确的";做事的方式。为了在GUI线程和渲染线程之间共享/传输数据,我可以采取什么方法?

对于synchronize((方法中太大而无法复制的数据,请使用同步对象来管理对数据的访问;写入时锁定它,完成时释放它,渲染时锁定它并直接访问数据。只要一次只有一个线程访问数据,您就安全了。

同步对象锁定的时间越长,跳过帧的风险就越大。锁定写入时间超过最佳渲染量的一半(8.5ms=~16.7ms/2(会导致帧丢失,但你的应用程序中可能会发生更多情况,因此实际数字更低。

或者,您可以为具有受保护索引变量的大型数据结构使用循环缓冲区,这样您就可以在读取另一个结构的同时写入一个结构。当所有数据都准备好显示并调用QQuickItem::update((时,增加索引变量。