在Linux上,QPainter::drawText的性能较差

5
我注意到在Linux上,当使用QPainter::drawText与缩放窗口映射一起使用时,速度非常慢。有什么办法可以解决这个问题吗?我已经检查过禁用抗锯齿或启用光栅渲染器是否有所不同,但都没有效果。
例如:当使用视口大小为(450px,200px),窗口大小为100倍因子(45000,20000),因此字体大小也增加了100倍(1400pt)时,在Linux上渲染30次文本“hello”大约需要4秒钟 - 在OpenSuse和Ubuntu上都是如此。
相同的示例在Windows和Mac上渲染得很快。
仅供澄清:虽然字体大小被缩放了,但由于所述的窗口<->视口映射,文本显示在屏幕上的尺寸是“正常”的。
这是我使用的简单示例代码:
void Widget::paintEvent(QPaintEvent *event)
{
    const int scaleFactor = 100;

    QPainter painter(this);

    // Setup font
    QFont font;
    font.setPointSize(14*scaleFactor);
    painter.setFont(font);

    // Setup mapping
    painter.setWindow(0, 0, width() * scaleFactor, height() * scaleFactor);

    // Render the text
    for (int i = 0; i < 30; i++)
        painter.drawText(qrand() % (width() * scaleFactor), qrand() % (height() * scaleFactor), "Hello");
}

任何帮助都会非常棒。
注意:我正在使用Qt 4.8.5版本。

你试过使用 painter.scale(scaleFactor, scaleFactor); 来缩放绘图器,而不是设置窗口矩形吗?这样做有什么区别吗? - vahancho
我刚刚进行了一个快速测试。这没有任何区别。 - Fabian
好的。那么也许您可以考虑通过可见区域来限制绘图区域,使其远小于45000x20000像素? - vahancho
据我所知,这是Qt的一个bug,你应该报告它。 - Kuba hasn't forgotten Monica
我已经在Qt的Bug报告中发布了关于此问题的内容:https://bugreports.qt-project.org/browse/QTBUG-36745 - Fabian
显示剩余2条评论
2个回答

1
这个问题很旧,但似乎Qt的bug仍未解决,以下是可能的解决方案... 我不确定这是否可行,但在我工作的两个项目中,我们实现了标签,它们在内部首先呈现为pimap /图像,然后再绘制。 因此,将您的文本缓存到具有透明背景的图像中应该可以解决问题。 我不认为这会有所区别,但您也可以检查QStaticText在您的情况下对性能是否有益。

好主意 - 我立刻进行了测试。不幸的是,它并没有解决问题。有趣的是,它最终在相同的渲染路径上结束。Win和Linux之间的相关差异似乎在于RasterPaintEngine :: drawTextItem()方法。在Windows上,此方法调用drawCachedGlyphs(),该方法将缓存的字形复制到屏幕空间中。在Linux上,它使用QPaintEngineEx :: drawTextItem(),该方法在窗口空间中呈现字形,因此真正大。 - Fabian

1

发现问题!

我的Linux系统上没有安装FontConfig开发库。这导致Qt使用XLFD进行构建,显然与缩放映射不兼容(请参见上面的报告)。

安装了FontConfig dev libs并重新构建了Qt后,文本现在可以快速而美观地渲染。我还额外指定了“-fontconfig”参数来重新构建Qt,只是为了确保,但据Qt人员称这不是必需的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接