具有Qt的C ++缓冲区

托马斯·阿尤布(Thomas Ayoub)

我使用制作了一个视频播放器QtOpenGl并且FFMpeg效果很好。

现在,我想使用多线程和缓冲区来获得更好的性能。我设置了一个线程,对帧进行解码并将其存储在QMap中:

QMap<int, uint8_t *> myBuffer;

第一个int是时间码,第二个是OpenGl Texture。

每次解码帧时,我都会使用new将该帧添加到缓冲区中,并在读取帧后立即将delete其添加。

假设这不是最佳方法,不是内存管理(无内存泄漏),而是性能。

有更好的方法来做到这一点吗?

数据狼

您可以直接解码为OpenGL像素缓冲区对象。创建一个数量(3个或4个就足够了)的PBO,并使渲染器线程至少使用其中的2个将它们映射到进程地址空间glMapBuffer,并将位置和PBO ID排队到可用缓冲区池中。要解码帧,请从可用的PBO池中取出指针/ ID,然后解码到提供的内存中。解码完一帧后,将使用的PBO的ID排入“解码的”池中,渲染器线程使用该池glUnmapBuffer();立即取消映射,然后使用加载到纹理中glTexSubImage2D; 纹理上传异步发生。将纹理ID排队到“准备显示”队列/ FIFO中。然后让渲染器从“准备显示”队列中退出,以显示纹理;通过在“准备显示”中保留至少3个元素,FIFO帧可以异步上载,同时绘制先前已解码的帧而没有OpenGL阻塞,因为它必须等待之前的步骤完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章