使用QQuickFramebufferObject时同步数据的最佳方式是什么
What is the best way to synchronize data when using QQuickFramebufferObject?
所以我在Qt应用程序中使用QQuickFramebufferObject
和QQuickFramebufferObject::Renderer
。如前所述:
为了避免竞争条件和两个线程的读/写问题,重要的是渲染器和项永远不要读或写共享变量。项目和渲染器之间的通信应该主要通过QQuickFramebufferObject::renderer::synchronize((函数进行。
因此,当调用QQuickFramebufferObject::Renderer::synchronize()
时,我必须同步我渲染的任何数据。但是,因为很多时候发送到渲染线程的数据可能非常大,所以我希望避免复制该数据(存储在DataObject
中(,所以现在我在函数中传递一个std::shared_ptr<DataObject>
,并将其分配给QQuickFramebufferObject::Renderer
类的一个私有成员。这种方法效果很好,但我不确定这是否是";正确的";做事的方式。为了在GUI线程和渲染线程之间共享/传输数据,我可以采取什么方法?
对于synchronize((方法中太大而无法复制的数据,请使用同步对象来管理对数据的访问;写入时锁定它,完成时释放它,渲染时锁定它并直接访问数据。只要一次只有一个线程访问数据,您就安全了。
同步对象锁定的时间越长,跳过帧的风险就越大。锁定写入时间超过最佳渲染量的一半(8.5ms=~16.7ms/2(会导致帧丢失,但你的应用程序中可能会发生更多情况,因此实际数字更低。
或者,您可以为具有受保护索引变量的大型数据结构使用循环缓冲区,这样您就可以在读取另一个结构的同时写入一个结构。当所有数据都准备好显示并调用QQuickItem::update((时,增加索引变量。
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 在reactor中存储eventHandlers的最佳方式是什么
- 在AVX通道中混洗的最佳方式
- 从 T 创建 std::future 的最佳方式<T>
- C++:使用 std::unique_ptr 访问重载运算符++的最佳方式?
- 对列表列表中的元素进行分组的最佳方式
- 利用 GPU 的最佳方式
- 使用 QT C++过滤大数据的最佳方式
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 在C++中共享键值对的最佳方式
- 为Catch2中的外部文本文件指定路径的最佳方式
- 代表Quarto棋盘游戏棋子的最佳方式
- 等待线程的最佳方式是什么
- 将uint8_t*buffer和size_tbufferlen从C++传递到C中的API函数的最佳方式是什么
- 创建控制台菜单C++的最佳方式
- 只显示片段着色器的最佳方式是什么
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?