2014-02-07 6 views
5

Ich habe festgestellt, dass QPainter :: drawText unter Linux schrecklich langsam ist, wenn es mit einer skalierten Fensterzuordnung verwendet wird. Kann ich irgendetwas dagegen tun? Ich habe bereits überprüft, ob die Deaktivierung von Anti-Aliasing oder die Aktivierung des Raster-Renderers einen Unterschied macht, tut dies aber nicht.Schlechte Performance von QPainter :: drawText unter Linux

Beispiel: Wenn Sie eine Darstellungsfeldgröße von (450px, 200px) verwenden, wird eine Fenstergröße von Faktor 100 (45000, 20000) und damit auch um den Faktor 100 skaliert (1400pt) und das 30-fache wiedergegeben hallo "dauert unter Linux etwa 4 (!) Sekunden - sowohl auf OpenSuse als auch auf Ubuntu.

Das gleiche Beispiel wird im Handumdrehen auf Windows und Mac gerendert.

Nur zur Klarstellung: Obwohl die Schriftgröße hochskaliert wird, erscheint der Text aufgrund des beschriebenen Fensters < -> Ansichtsfensterzuordnung in "normaler" Größe auf dem Bildschirm.

Hier ist die einfache Beispielcode ich verwende:

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"); 
} 

Jede Hilfe wäre genial.

Hinweis: Ich bin mit Qt 4.8.5

+0

Haben Sie versucht, den Maler mit 'painter.scale (scaleFactor, scaleFactor) 'zu skalieren, anstatt das Fensterrechteck zu setzen? Macht es einen Unterschied? – vahancho

+0

Ich habe gerade einen Schnelltest gemacht. Es macht keinen Unterschied. – Fabian

+0

Ok. Dann könntest du dir eine Grenze für den Zeichnungsbereich vorstellen, die deutlich kleiner als 45000x20000px ist. – vahancho

Antwort

1

Problem gefunden!

Die FontConfig-Entwicklerbibliotheken waren nicht auf meinem Linux-System installiert. Dies führte dazu, dass Qt gegen XLFD erstellt wurde, was offensichtlich bei skalierten Abbildungen nicht gut funktioniert (siehe Bericht oben).

Nach der Installation der FontConfig devls und der Neuerstellung von Qt wird der Text jetzt schnell und einfach gerendert. Ich habe zusätzlich den "-fontconfig" -Parameter angegeben, um Qt neu aufzubauen, nur um sicher zu sein, aber laut den Qt-Leuten sollte das nicht notwendig sein.

1

Diese Frage ist ziemlich alt, aber als Qt Bug sein scheint immer noch ungelöst, hier zu sein wir gehen ...

Nicht sicher, ob dies eine Option sein aber in zwei Projekten, für die ich gearbeitet habe, haben wir Labels implementiert, die zuerst intern in ein Pimap/Bild gerendert wurden, das dann gezeichnet wurde. So sollten Sie Ihren Text in einem Bild mit transparentem Hintergrund zwischenspeichern, um das Problem zu lösen.

Ich denke nicht, dass es hier einen Unterschied macht, aber Sie könnten auch prüfen, ob QStaticText einen positiven Einfluss auf die Leistung in Ihrem Fall hat.

+0

Gute Idee - Ich habe das sofort getestet. Leider löst es das Problem nicht. Interessanterweise endet es auf demselben Rendering-Pfad. Der relevante Unterschied zwischen Win und Linux scheint in RasterPaintEngine :: drawTextItem() zu liegen. Unter Windows ruft diese Methode drawCachedGlyphs() auf, die das zwischengespeicherte Zeichen im Bildschirmbereich kopiert. Unter Linux verwendet es QPaintEngineEx :: drawTextItem(), das das Zeichen im Windows-Raum rendert und somit * wirklich * groß. – Fabian