首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGLWidget -更快的grabFrameBuffer

QGLWidget -更快的grabFrameBuffer
EN

Stack Overflow用户
提问于 2014-01-16 20:17:16
回答 1查看 1.1K关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-16 20:58:08

QImage::bits()只执行深度复制,因为您要求它。

对于常量数据,不重复QImage中已经存在的数据的正确方法是:

代码语言:javascript
复制
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(); 

如果将位传递给的代码因不正确而中断,则可以强制转换以下比特:

代码语言:javascript
复制
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并从FBO获取映像来节省CPU和系统内存带宽。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21171982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档