2014-02-07 61 views
5

我注意到,在使用縮放窗口映射時,QPainter :: drawText在Linux上速度非常慢。我能做些什麼嗎?我已經檢查了禁用抗鋸齒或啓用柵格渲染器是否有所作爲,但事實並非如此。例如:當使用(450px,200px)的視口大小,因子100(45000,20000)的窗口大小以及由此因子100(1400pt)放大的字體大小時,渲染30次文本「 hello「在Linux上花費大約4(!)秒 - 在OpenSuse和Ubuntu上都是如此。Linux上QPainter :: drawText性能不佳

相同的示例在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

+0

你嘗試用'painter.scale(scaleFactor,scaleFactor);縮放畫家嗎?'而不是設置窗口矩形?它有什麼區別? – vahancho

+0

我現在做了一個快速測試。它沒有什麼區別。 – Fabian

+0

好的。也許你可以想象一個可視面積比45000x20000px小得多的繪圖區域限制? – vahancho

回答

1

發現問題!

未安裝在我的Linux系統上的FontConfig開發人員庫。這導致Qt被構建爲針對XLFD,這對於縮放映射顯然不起作用(參見上面的報告)。

在安裝FontConfig開發庫並重建Qt之後,文本現在變得很好且很快。在重建Qt時,我還額外指定了「-fontconfig」參數,只是可以肯定的,但根據Qt人員,這不應該是必需的。

1

這個問題是很老,但因爲是Qt的錯誤似乎仍然沒有得到解決這裏我們去...

不知道這可能是一種選擇但是在我爲之工作的兩個項目中,我們實現了首先內部呈現爲pimap/image的標籤,然後繪製標籤。 因此,在透明背景的圖像中緩存文本應該可以解決問題。

我不認爲這有什麼不同,但你也可以檢查QStaticText是否對你的情況有好處的影響。

+0

好主意 - 我馬上就測試過了。不幸的是,它不能解決問題。有趣的是,它在相同的渲染路徑上結束。 Win和Linux之間的相關區別似乎在RasterPaintEngine :: drawTextItem()中。在Windows上,此方法調用drawCachedGlyphs(),將緩存的字形複製到屏幕空間中。在Linux上,它使用QPaintEngineEx :: drawTextItem()來渲染窗口空間中的字形,因此非常大。 – Fabian