c++ - QOpenGLWidget 多进程视频渲染性能
问题描述
如果没有代码,我的问题可能看起来很模糊,但实际上并非如此。
所以,我有一个几乎可以正常工作的小部件,它可以渲染视频帧。
Qt 5.10 和 QOpenGLWidget 子类化工作正常,我没有进行任何复杂的优化——有两个纹理和几个着色器,将 YUV 像素格式转换为 RGB—— glTexImage2D()
+ 着色器,没有缓冲区。
视频帧是从 FFMPEG 获得的,由于硬件加速,它表现出很好的性能......当只有一个视频窗口时。
该软件是一个“视频墙”——同一屏幕上的多个独立视频窗口。当然,多线程将是首选的解决方案,但现在遗留的,我不能改变它。
因此,无论窗口大小如何,1 个全高清视频窗口都会消耗约 2% 的 CPU 和 8-10% 的 GPU。但是从同一个可执行文件同时启动的 7-10 个类似的窗口几乎消耗了所有 CPU。我的数学表明 2 x 8 != 100 ...
我最好的猜测是:
- 这是一个 ffmpeg 解码器的问题,硬件加速仍然不是魔法,一些硬件管道停顿
- 7-8-9 独立的 OpenGL 上下文的成本远高于 1 成本 x N
- 我没有使用 PUBO 或其他一些复杂的技术来改进 OpenGL 渲染。它仍然什么也没解释,但至少它是一个猜测
在 Ubuntu 上的行为是相同的,其中解码使用不同的编解码器(我的意思是使用 GPU 加速或 CPU 加速的编解码器没有区别!),所以,我更有可能错过了关于 OpenGL 的一些东西......或者没有,因为使用动态纹理启动 6-7 个 Qt 示例显示 CPU 使用率正常增长——它大约是窗口数量的总和。
无论如何,对我来说,描述这个案例变得非常棘手,所以我希望之前有人可以解决类似的问题并可以与我分享他的经验。我将不胜感激任何想法,如何处理所描述的谜语。
如果有帮助,我可以添加任何代码。
解决方案
推荐阅读
- r - 如何使用 Slurm 在多个节点上发送循环?
- excel - 如何按单独的列有条件地排序?
- java - 在Java中以O(N)而不是O(NlogN)构建堆
- sql - 嵌套事务找不到保存点
- ios - 如何在帖子正文中使用 RxAlamofire 传递 json 进行帖子调用
- android - java.net.SocketTimeoutException:无法连接改造 kotlin
- python - 尝试在 python 中绘制图形会导致错误
- java - 对于这个星号条形图java程序,有更简单的方法吗?
- java - 将状态码放入 Java 接口
- c# - NavigationManager.StartNavigation 返回 INVALID_PARAMETERS