gpt4 book ai didi

c++ - 在 QML 中旋转图像时降低 CPU 使用率

转载 作者:太空狗 更新时间:2023-10-29 23:16:54 24 4
gpt4 key购买 nike

我创建了一个基于 Qt 5.2 的 QML 应用程序,我部署在 Mac OS X 和 Windows(从 XP 到 8)上。我的应用程序有一个主动画,它会在用户直播时无限期地旋转图像。此动画是应用程序的核心部分,我无法将其删除。

旋转图像会占用太多 CPU 资源,我正在寻找解决此问题的方法。其背后的原因是 很多 用户不支持 OpenGL 2(在 Windows 上),我将不得不依靠 MESA 的 DLL 在软件中进行渲染,这使得应用程序在这些机器上无法使用,而动画正在运行。

这是我目前在 QML 中实现的动画:

Image {
id: imgBroadcastState
source: "images/broadcast_button.png"
anchors.horizontalCenter: parent.horizontalCenter

NumberAnimation on rotation {
from: 0
to: 360
running: rootWindow.isBroadcasting
loops: Animation.Infinite
duration: 7000

onRunningChanged:{
if(!running) {
imgBroadcastState.rotation = 0;
}
}
}
}

我尝试的第一个解决方案是创建一个巨大的 Sprite ,其中包含我的动画的所有帧,然后我用 AnimatedSprite 加载它.这减少了 CPU,但显然还不够,RAM 消耗增加了两倍多,高达 300MB,这对于旧的 Windows XP 机器来说不是一个好的解决方案。

我也试过子类化 QQuickPaintedItem并每 30 毫秒手动调用一次 paint()(使用 QTimer)来旋转图像。这也会减少 CPU,但也不够。这是我使用的代码:

void MXPaintedItem::paint(QPainter *painter)
{
QTransform rot;
rot.rotate(m_angle);
painter->setRenderHint(QPainter::Antialiasing);
painter->setRenderHint(QPainter::SmoothPixmapTransform);
painter->translate(width() / 2, height() / 2);
painter->rotate(m_angle);
// Use preloaded QImage
painter->drawImage(QPoint(-width() / 2, -height() / 2), m_image);


m_angle += 2.5;
}

有什么方法可以改善这一点并降低旋转动画的 CPU 使用率吗?

编辑:

当然,我可以更改动画或不使用动画,但这不是一个长期的解决方案。最后,必须动态绘制/更新此图像以反射(reflect) VUMeter 并表示声级。所以我需要找到一个合适的解决方案,让我可以实时更新 QML View 的一部分,而不必重绘整个 UI 并占用大量 CPU。

编辑 2:我发现主要的 CPU 使用率不是旋转本身,而是每次都必须重绘整个 UI 的事实。您可以通过在 paint() 函数中调用 return 而不是旋转任何东西来确保这一点。与动画图像本身相比,CPU 使用率是相同的,这表明问题出在每次更新场景中的一个 QML 组件时更新整个 UI

最佳答案

如果你有内存空间,旋转次数少,每次旋转使用一张位图。这就是自计算机出现以来编写“spinners”的方式。

理论上,bitblit 比执行旋转变换然后 blit 生成的图像更快。

关于c++ - 在 QML 中旋转图像时降低 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21531781/

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