Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading OpenGL视频播放器的纹理缓冲区_Multithreading_Opengl_Textures_Video Processing - Fatal编程技术网

Multithreading OpenGL视频播放器的纹理缓冲区

Multithreading OpenGL视频播放器的纹理缓冲区,multithreading,opengl,textures,video-processing,Multithreading,Opengl,Textures,Video Processing,我正在使用OpenGL、Ffmpeg和SDL播放视频,目前正在优化获取帧、解码帧、将帧从YUV转换为RGB、将帧上传到纹理并将纹理显示在四边形上的过程。每个阶段都由一个单独的线程执行,它们被写入共享缓冲区,共享缓冲区由SDL互斥体和条件控制(除了上传和显示纹理,因为它们需要在相同的上下文中) 我让播放器在不同的线程上很好地处理解码、转换和OpenGL上下文,但我意识到,因为视频是每秒25帧的,所以我只从缓冲区获得一个转换后的帧,上传到OpenGL,并在OpenGL线程中每40毫秒绑定/显示一次。

我正在使用OpenGL、Ffmpeg和SDL播放视频,目前正在优化获取帧、解码帧、将帧从YUV转换为RGB、将帧上传到纹理并将纹理显示在四边形上的过程。每个阶段都由一个单独的线程执行,它们被写入共享缓冲区,共享缓冲区由SDL互斥体和条件控制(除了上传和显示纹理,因为它们需要在相同的上下文中)

我让播放器在不同的线程上很好地处理解码、转换和OpenGL上下文,但我意识到,因为视频是每秒25帧的,所以我只从缓冲区获得一个转换后的帧,上传到OpenGL,并在OpenGL线程中每40毫秒绑定/显示一次。由于存在40毫秒的间隙,渲染循环大约循环6-10次,每显示一帧都不显示下一帧

因此,我决定为纹理也设置一个缓冲区,并设置一个用glGenTextures()创建和初始化的纹理数组,以及我需要的glGenTextures参数等

当上次帧刷新后还没有40毫秒时,将运行一个方法,该方法从转换缓冲区获取下一个转换帧,并通过绑定它然后调用glTexSubImage2D()将其上载到纹理缓冲区中的下一个自由纹理。自上次帧刷新到40毫秒后,将运行一个单独的方法,从纹理缓冲区获取下一个GLuint纹理,并将其与glBindTexture()绑定。因此,有效地说,我只是将之前所做的工作(从转换缓冲区抓取,上传,显示)分解为不同的方法(从转换缓冲区抓取,上传到纹理缓冲区|和|从纹理缓冲区抓取,显示),以利用40毫秒刷新之间浪费的时间

这听起来合理吗?因为在运行时,视频会断断续续地暂停,有时会在本应播放的时候播放大约4帧(每40毫秒),但会有2秒的间隔,然后显示1帧,然后是3秒的间隔,视频完全无法播放

代码与我管理convert线程的方式几乎相同,我从解码缓冲区抓取解码帧,将它们从YUV转换为RGB,然后将它们放入convert缓冲区,这样就看不到大规模瓶颈可能在哪里

瓶颈会出现在OpenGL方面吗?我将新的图像数据存储到10种不同的纹理中,这是否是一个问题,因为当从纹理缓冲区抓取一个新纹理时,原始数据在视频内存中的内存位置可能与最后一个纹理相差一百万英里?这是我唯一尝试的答案,但我不知道OpenGL在内部是如何工作的,所以这就是我在这里发布的原因


有人有什么想法吗?

我不是OpenGL专家,但我猜瓶颈在于纹理在系统内存中被正确初始化,但在“错误”的时间被发送到视频内存(就像一次发送而不是尽快发送一样),导致管道停滞。使用glTexSubImage2D时,在绑定纹理之前,无法保证纹理何时到达视频内存


谷歌搜索pixelbuffer对象似乎可以让你更好地控制它们在视频内存中的时间:

我不是OpenGL专家,但我猜瓶颈在于纹理在系统内存中被正确初始化,但在“错误”的时间被发送到视频内存(就像一次发送而不是尽快发送一样),管道堵塞。使用glTexSubImage2D时,在绑定纹理之前,无法保证纹理何时到达视频内存

谷歌搜索pixelbuffer对象似乎可以让您更好地控制它们在视频内存中的时间: