我想过如何实现一个 Qt 播放器。帧解码发生在 Qt 之外。在 Qt 方面,只需要通过paintEvent()+输出帧QImage。我找到了一种机制,允许您将任何 Qt 对象刷新到创建的QThread-QObject::moveToThread()中,但有一个限制:
如果对象有父对象,则不能移动它。
无论如何,小部件都会有一个父级,否则它是无用的。想象一下,您需要以 60 FPS 的速度输出 4K 帧。我怀疑 Qt 的主线程能否很好地处理这个问题。
告诉我,有没有办法解决这个问题?或者也许我错了,一切都应该没问题?
在我看来,你的头脑有点转变。
首先关于线程中的对象。这是出于一个主要目的 - 谁将维护对象的消息队列。默认情况下,采用该对象的父级流。这就是为什么写在那里你不能移动有父对象的原因。但是没有人会费心简单地创建一个对象并将其放入适当的流中。
小部件应该在主线程上运行,这是 UI 在大多数框架中的工作方式。否则,很难处理所有内容。Qt 也不例外——你不能在主线程之外绘制小部件。Qt 论坛上en SO上这个问题的答案的变体。
现在到 4k@60。也许您想播放视频。在这种情况下,您还需要处理解码它。这正是其他线程可以做的,在内存中准备图片。并且主线程已经替换了它们。
4k 是 3840 x 2160。如果一个像素是 4 字节,那么每帧 31 兆字节的数据,即 1.8 吉字节。很多。因此,大部分玩家不会长时间直接抽奖。通常使用显卡的能力,应用程序只是提供了一个绘图的地方(因此,有时当用播放器截取窗口时,会出现黑屏)。