Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在嵌入式应用程序中绘制背景图像会在迁移到Qt 5.9.3后导致性能下降?_C++_Linux_Qt_Embedded_Qpixmap - Fatal编程技术网

C++ 为什么在嵌入式应用程序中绘制背景图像会在迁移到Qt 5.9.3后导致性能下降?

C++ 为什么在嵌入式应用程序中绘制背景图像会在迁移到Qt 5.9.3后导致性能下降?,c++,linux,qt,embedded,qpixmap,C++,Linux,Qt,Embedded,Qpixmap,我的应用程序正在嵌入式系统上运行。我已经将应用程序从Qt5.6迁移到Qt5.9.3,速度变得非常慢。我检查了top命令的输出,发现我的应用程序导致CPU利用率达到100% 因此,我检查了我的应用程序,发现代码的这一部分存在问题: MainWidget::MainWidget(QWidget *parent) : QWidget(parent) { ... QPixmap bg(BACK_IMG_PATH); bg.fill(Qt::transparent); Q

我的应用程序正在嵌入式系统上运行。我已经将应用程序从Qt5.6迁移到Qt5.9.3,速度变得非常慢。我检查了
top
命令的输出,发现我的应用程序导致CPU利用率达到100%

因此,我检查了我的应用程序,发现代码的这一部分存在问题:

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
...

    QPixmap bg(BACK_IMG_PATH);
    bg.fill(Qt::transparent);
    QPalette p(palette());
    p.setBrush(QPalette::Background, bg);
    setAutoFillBackground(true);
    setPalette(p);
...
}
问题是,如果我在后台添加代码,我的应用程序会变得非常慢。但是,如果我删除此代码,我的应用程序将按预期工作。但这不是一个解决方案,因为我需要背景

迁移之前不存在此问题

我尝试通过重新实现
paintEvent
并使用QPainter来解决此问题,如下所示:

void MainWidget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.drawImage(QRectF(this->x(), this->y(), this->width(), this->height()), QImage("img/bg_1280_720.png"));
}
这个结果稍微快一点,但仍然不令人满意(cpu利用率为50%)


如何解决这个问题?

一个加速的方法是,不要每次绘制图像时都从文件中加载图像,而是将其加载到构造函数中并存储在成员变量中。如果这是一个性能回归,您可能应该查看QT的变更日志,检查其邮件列表,等等。理想情况下,看看您是否可以开发一段最小的代码,以显示版本之间的巨大性能差异-如果您有,并且问题是原始的,那么您就有了向开发人员提供有用报告的基础。但是您需要有最少的代码来演示他们可以尝试的差异,并且您需要彻底检查以确保这不是一个已知问题,也不是在使用这两个版本时需要做的事情上的差异。