Qt Zeichengeschwindigkeit



  • Hallo, seit gestern arbeite ich mit QT an einem Mapeditor bzw. an etwas das mal einer werden soll.

    Dazu habe ich angefangen mir Parzellen als Grundmuster bzw- Grundeinheit der Karte zu erstellen und zeichnen zu lassen.
    Ich habe derzeit ein Mutterwidget in dem sich ein weiteres Widget befindet in welchem ich die Parzellen zeichne.
    Leider scheint das relativ langsam zu sein, daher meine Frage ob das an der Weise liegt wie ich das mache oder QT einfach langsam ist bei sowelchen Anwendungen?

    Hier mein Zeichenalgorithmus:

    for(std::vector<parcel>::iterator it = field.gamefield.begin();it < field.gamefield.end();it++)
        {
            QPoint bottom_right(it -> position.x() + PARCEL_SIDE,it -> position.y() + PARCEL_SIDE);
            QRect draw_rect(it-> position,bottom_right);
            if(it -> position == QPoint(mouse_x,mouse_y))
                painter.fillRect(draw_rect,QBrush(Qt::green,Qt::SolidPattern));
            else
            painter.fillRect(draw_rect,QBrush(it->mycolor,Qt::SolidPattern));
            painter.setPen(Qt::black);
            painter.drawRect(draw_rect);
        }
    

    Die Parzellen sind in einem Vektor gespeichert welchen ich durchlaufe und gemäß der in den Parzellen gespeicherten Informationen dann die Zeichenoperation ausführe. Dazu kommt dann noch ein schwarzer Rand, da ich am Anfang jede Parzelle einfach Blau zeichne, es sei denn es ist jene auf der der Mauszeiger ruht, dann ist sie Grün.

    Ich habe ferner noch eine Mausroutine, welche die Parzelle ermittelt auf welcher sich die Maus befindet.

    void CannonField::mouseMoveEvent(QMouseEvent *event)
    {
        if(event -> x() <= 0 && event -> y() <= 0)
        {
            mouse_x = 0;mouse_y = 0;
        }
        else
        {
            mouse_x = (int)(event->pos().x() / PARCEL_SIDEF) *PARCEL_SIDE;
            mouse_y = (int)(event->pos().y() / PARCEL_SIDEF)*PARCEL_SIDE;
            update();
        }
    }
    

    Nun das "Problem": Die entsprechende Parzelle wechselt zwar ihre Farbe, allerdings relativ langsam d.h. das zeichnen hinkt bei schnelleren Mausbewegungen etwas hinterher, was zwar nicht so wichtig ist bei einem Editor aber doch finde ich nervig ist.

    Insgesamt habe ich 30000 Parzellen(derzeit), allerdings zeichne ich immer nur einen kleineren Ausschnitt, zumindest so wie ich derzeit QT verstehe.
    Oder ist es so, dass er alles tatsächlich "zeichnet" auch wenn es auf dem widget überhaupt nicht zu sehen ist, da es weit außerhalb der sichtbaren Bereichs liegt?(anders als z.B. OpenGL das macht)

    Vielen Dank für eure Hilfe



  • Also ich hab die Zeichenfunktion jetzt mal in der Art geändert, dass sie nur zeichnet wenn die Parzelle auch zu sehen ist, was dazu geführt hat das das Programm nun deutlich schneller läuft.
    Falls jemand allerdings immernoch Tipps in dieser Hinsicht für mich hat, kann er gerne hier posten ich lese es mir aufjedenfall durch 🙂



  • [quote="Namenloser342"]
    Falls jemand allerdings immernoch Tipps in dieser Hinsicht für mich hat, kann er gerne hier posten ich lese es mir aufjedenfall durch :)[/quote]

    Das fillRect() kannst Du Dir wahrscheinlich sparen. drawRect() benutzt "innen" auch die aktuelle QBrush. "clippen" solltest Du natuerlich trotzdem. Du kriegst ja billig raus, ob die Parzelle ausserhalb des Bildschirms liegt. Natuerlich wird auch sonst irgendwann geclippt, aber den Aufwand die QPen und QBrush zu setzen, sparst Du beim "selber clippern".


  • Mod

    Schau dir mal QGraphicsView an, und einen OpenGL basierten Painter könnte dir evtl. noch was bringen.


Log in to reply