【问题标题】:Qt graphics performance on soft-float ARM?软浮点 ARM 上的 Qt 图形性能?
【发布时间】:2014-04-24 04:46:17
【问题描述】:

我想创建一个类似于汽车仪表板的 Qt 界面(仪表、刻度盘、旋钮等)。 我的设备有一个 800x480 LCD,由 imx287 ARM SoC(没有硬件浮动或 GPU 的 armv5te)供电。

我遇到的问题是它非常慢。 以 20fps 绘制的单个仪表(背景 PNG 图像,带有旋转的 PNG 表盘图像)使用约 20% 的 CPU 时间。 添加单个渲染文本字符串最多可增加 40% 的 CPU 使用率。

我正在使用 QGraphicsScene,我使用了很多浮点计算...这是一个问题,因为我的 SoC 没有硬件浮点能力。

QGraphicsScene 有什么替代品对我有用吗?

这是我目前正在做的事情:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

bg.load("rpm.png");
needle.load("needle.png");

scene = new QGraphicsScene(this);
scene->setSceneRect(0,0, 800,480);

scene->addPixmap(bg);

needleItem = scene->addPixmap(needle);
needleItem->setPos(400-4,17);

textItem = scene->addText(tr(""), QFont("utsaah", 50, QFont::Bold, true));
textItem->setDefaultTextColor(QColor(255,255,255));
textItem->setPos(430, 360);

ui->graphicsView->setScene(scene);

thread = new UpdateDialsThread(this);
connect(thread, SIGNAL(updateDials()), this, SLOT(updateDials()));
thread->start();
}

void MainWindow::updateDials(void)
{
static int deg = 180;

deg += 1;
if (deg > 180+270)
    deg = 180;

QTransform trans;
trans.translate(needleItem->boundingRect().width()/2, needleItem->boundingRect().height());
trans.rotate(deg, Qt::ZAxis);
trans.translate(-needleItem->boundingRect().width()/2, -needleItem->boundingRect().height());
needleItem->setTransform(trans);

textItem->setPlainText(tr("%1").arg(deg*10, 4, 'f', 0));
}

提前致谢!

【问题讨论】:

  • 我在自定义构建的发行版上使用 Qt 4.8.5(使用 buildroot)。我试过使用这个来降低位深度,但它似乎没有任何效果。我不确定如何在应用程序中测试位深度以检查选项是否有效。 QWS_DISPLAY=LinuxFb:/dev/fb0:depth=16 QWS_DEPTH=16 ./test3 -qws
  • 我用 -O3 构建了整个操作系统,但现在我试试 -Os 看看有什么区别。我已经用 -march=armv5te -mtune=arm926ej-s 编译了所有东西。 Qt 确实启用了深度 1、16、24、32,但我尝试只启用 1 和 16。这是我正在使用的板:crystalfontz.com/product/CFA921TS。感谢您的帮助。
  • blit_setup():不支持屏幕深度 32! linuxfb设备只支持32bit。
  • 好的,更新。我尝试使用 -Os 构建所有内容,测试应用程序(如上代码)使用的 CPU 使用率比 -O3 多 4%。添加 -no-armfpa 似乎没有任何区别。我现在改用 GCC 4.8.1 而不是 4.6.x,它减少了大约 8% 的 CPU 使用率。除非你们有更多的建议,否则看起来这已经是最好的了。
  • 你当然可以让驱动支持16bit帧缓存(甚至更少); IMX 只是将低/未使用的线设置为零。这将是内存带宽的 1/2,这是 blitter 的主要问题。你有Linux源码吗?它是哪个版本?如果你不能改变 Linux,那么这是你所希望的最好的。

标签: performance qt embedded arm qgraphicsscene


【解决方案1】:

我建议使用 QML 而不是 QGraphicsView。您可以创建具有引人注目的动画且性能良好的自定义仪表。您还可以使用弹簧和阻尼效果。你可以看看Dial Control Example

【讨论】:

  • 拨号控制示例在移动滑块时使用了约 60% 的 CPU 使用率。不是一个选项。
【解决方案2】:

我最终转向了 Allegro 4。

它更适合这项任务。更轻巧,并且支持定点数学。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多