【发布时间】: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