Performance QSGImageNode规模性能

Performance QSGImageNode规模性能,performance,qt,qml,qimage,Performance,Qt,Qml,Qimage,我试图使QML组件,将生活输出和规模的形象2000x2000@60fps 我最终得到了定制的QQuickItem,因为QQuickImageProvider似乎是为其他目的而设计的,而QQuickPaintedItem并没有给我设计的性能 因此,我: MyQuickItem.cpp MyQuickItem::MyQuickItem(QQuickItem *parent) : QQuickItem(parent) { setFlag(ItemHasContents, true);

我试图使QML组件,将生活输出和规模的形象2000x2000@60fps

我最终得到了定制的QQuickItem,因为QQuickImageProvider似乎是为其他目的而设计的,而QQuickPaintedItem并没有给我设计的性能

因此,我:

MyQuickItem.cpp

MyQuickItem::MyQuickItem(QQuickItem *parent)
    : QQuickItem(parent)
{
    setFlag(ItemHasContents, true);
}

void MyQuickItem::setImage(QImage image)
{
    if (!image.isNull()) {
        currentImg = image;
        update();
    }
}

QSGNode* MyQuickItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *data)
{
    QSGImageNode * node;
    if (!oldNode) {
        node = window()->createImageNode();
        oldNode = node;
    } else {
        node = static_cast<QSGImageNode *>(oldNode);
    }

    QSGTexture *texture = window()->createTextureFromImage(currentImg);

    node->setRect(boundingRect());
    node->setSourceRect(QRectF(QPointF(0.0, 0.0), texture->textureSize()));
    node->setTexture(texture);
    node->setOwnsTexture(true);

    return node;
}
我让它工作了。ImageGenerator生成2000x2000 QImage并将其发送到MyItem,即MyQuickItem

而且还是很慢。它消耗了约30%的i5-4460,并“冻结”了其他UI组件

调查:

将QSGImageNode更改为具有纯色的QSGRETangleNode,但仍在执行

QSGTexture *texture = window()->createTextureFromImage(currentImg);
将CPU使用率降低到1-3%

但只要我加上

texture->bind();
你好,又是30%的CPU

所以,一个问题是,2000x2000图像上传到GPU的速度太慢

另一方面

QSGTexture *texture = window()->createTextureFromImage(currentImg.scaled(boundingRect().size().toSize())); 
使用bind()和不使用bind()提供相同的30%CPU

另一个问题是扩展2000x2000以适应CPU上的QML组件大小太慢

有没有可能减少这种令人厌恶的CPU消耗

另外,我不能生成其他大小的QImage,但可以使用poiner缓冲区生成图像

最初,这个图像生成器用于QWidget,没有这样的问题:QImage创建为2000x2000,并设置为QWidget的图像。同样的CPU消耗大约为2-3%。

TL:DR

部分解决方案:

将QImage构造为

m_pImage = new QImage( width, height, QImage::Format_ARGB32_Premultiplied );
并相应地填充预乘ARGB

调查:

通过使用环境变量set分析输出,我发现GUI线程在每帧等待同步时被阻塞60毫秒。转换图像长度为45毫秒,上传时间仅为15毫秒

我发现,如果原始图像不是RGB32格式或ARGB32格式的预乘,它将转换为ARGB32格式的预乘

在将原始图像更改为格式_ARGB32_Premultiplied后,我只阻塞了1毫秒的GUI线程,转换为0毫秒,并上传相同的15毫秒

它仍然消耗了30%的CPU(IDK为什么),但至少我没有了更多的CPU,这会冻结在UI元素上。

TL:DR

部分解决方案:

将QImage构造为

m_pImage = new QImage( width, height, QImage::Format_ARGB32_Premultiplied );
并相应地填充预乘ARGB

调查:

通过使用环境变量set分析输出,我发现GUI线程在每帧等待同步时被阻塞60毫秒。转换图像长度为45毫秒,上传时间仅为15毫秒

我发现,如果原始图像不是RGB32格式或ARGB32格式的预乘,它将转换为ARGB32格式的预乘

在将原始图像更改为格式_ARGB32_Premultiplied后,我只阻塞了1毫秒的GUI线程,转换为0毫秒,并上传相同的15毫秒

它仍然消耗了30%的CPU(IDK为什么),但至少我不再有了,这会冻结在UI元素上

m_pImage = new QImage( width, height, QImage::Format_ARGB32_Premultiplied );