gpt4 book ai didi

c++ - QGLWidget - 更快的 grabFrameBuffer

转载 作者:行者123 更新时间:2023-11-28 07:09:57 26 4
gpt4 key购买 nike

我有一种流媒体应用程序,它应该捕获窗口的内容。在窗口中,一个 QGLWidget 绘制了东西。目前我在每个绘制周期中都使用 widget.grabFrameBuffer(必须是实时的)。该应用使用 100% 的 CPU,如果没有 widget.grabFrameBuffer,它会下降到 10-20%。我想通了,调用 image.bits() (我需要的,用于发送 QImage 数据)创建了一个拷贝(不是解决问题的好方法)。有人知道如何获取指向帧缓冲区或图像数据的指针,还是必须使用 opengl 命令?

最佳答案

QImage::bits() 只执行深拷贝,因为你要求它这样做。

对于常量数据,正确的做法是:

const QImage & frame(widget.grabFrameBuffer());
// compiler enforces const on uchar
const uchar * bits = frame.constBits();
// or
// if you forget const on uchar, this would deep copy
const uchar * bits = frame.constBits();

如果您将位传递给的代码因不是常量正确而损坏,您可以强制转换位:

class AssertNoImageModifications {
const char * m_bits;
int m_len;
quint16 m_checksum;
Q_DISABLE_COPY(AssertNoImageModifications)
public:
explicit AssertNoImageModifications(const QImage & image) :
m_bits(reinterpret_cast<const char*>(image.constBits())),
m_len(image.byteCount())
{
Q_ASSERT((m_checksum = qChecksum(m_bits, m_len)) || true);
}
~AssertNoImageModifications() {
Q_ASSERT(m_checksum == qChecksum(m_bits, m_len));
}
};

...
AssertNoImageModifications ani1(frame);
stupidAPI(const_cast<uchar*>(bits));

当然 grabFrameBuffer() 必须将数据从 GPU 内存复制到系统内存,但这不应该太昂贵。它应该使用 DMA 完成。

如果您想在将数据转储到图像之前缩小/重新采样数据,您可以通过运行 downsampler shader program 来节省 CPU 和系统内存带宽。 ,并从 FBO 获取图像。

关于c++ - QGLWidget - 更快的 grabFrameBuffer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171982/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com