软浮动ARM上的Qt图形性能?

时间:2014-04-24 04:46:17

标签: performance qt embedded arm qgraphicsscene

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

我遇到的问题很慢。 以20fps绘制的单个仪表(背景PNG图像,带有旋转PNG刻度盘图像)使用~20%的CPU时间。 添加单个渲染文本字符串会增加CPU使用率达到40%。

我正在使用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));
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我最终搬到了Allegro 4。

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