Frage

ich Hilfe brauchte bei dem Versuch, diesen Code Teil zu optimieren ... Im Grunde ist hier die Sache .. Ich mache diesen ‚Kalligraphie Stift‘, die den Kalligraphie-Effekt verleiht, indem Sie einfach eine Menge von benachbarten schrägen Linien zu zeichnen ... Die Problem ist folgende: Wenn ich die Auslosung Region mit Update aktualisieren () nach jeder einzelnen Ziehung einer schrägen Linie, die Ausgabe korrekt ist, in dem Sinne, dass Updates in angemessener Zeit erledigt werden, so dass alles ‚gezogen‘ mit dem Stift ist sofort die Zeichnung .. aber ‚gesehen‘, weil ein Los (100s von ihnen) von Updates fertig sind, wenn das Programm verlangsamt ein wenig auf der N900 laufen ...

Wenn ich versuche, eine wenig Optimierung zu tun Update, indem Sie nach dem Ziehen alle die schrägen Linien (so dass alle Linien auf das Zeichenbrett durch ein einzelnes Update aktualisiert werden ()), ist der Ausgang. .. seltsam .... das heißt, unmittelbar nach dem zeichnen der Linien, sie Linien scheinen gebrochen (sie haben freie Stellen, wo die Zeichnung als auch geschehen sollte) ... aber wenn ich eine Neuzeichnung des Formularfensters auslösen (zB durch die Größe der Form) zu ändern, wird der gebrochene Patches sofort behoben !! Als ich dieses Programm auf meinem N900 laufe, wird es den anfänglichen gebrochenen Ausgang und bleibt so, da ich weiß nicht, wie ein erneutes Zeichnen in diesem Fall zu erzwingen ...

Hier ist der erste 'optimiert' Code und Ausgabe (teilweise richtig / falsch)

void Canvas::drawLineTo(const QPoint &endPoint)
{
QPainter painter(&image);
painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
int fx=0,fy=0,k=0;
qPoints.clear();
connectingPointsCalculator2(qPoints,lastPoint.x(),lastPoint.y(),endPoint.x(),endPoint.y());
int i=0;
int x,y;
for(i=0;i<qPoints.size();i++)
{
x=qPoints.at(i).x();
y=qPoints.at(i).y();
painter.setPen(Qt::black);
painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
}
**//Updating only once after many draws:**
update (QRect(QPoint(lastPoint.x()-5,lastPoint.y()-5), QPoint(endPoint.x()+5,endPoint.y()+5)).normalized());

modified = true;
lastPoint = endPoint;
}

Bild direkt nach dem auf dem Bildschirm kritzeln:

http://img823.imageshack.us/img823/8755/59943912.png

Nach der Fenstergröße neu zu justieren, alle gebrochen oben Links fixiert sind, wie sie ..

sein sollten

Hier ist der zweite nicht-optimierten Code (seine Ausgabe korrekt rechts nach Zeichnung ist, genau wie im zweiten Bild oben):

void Canvas::drawLineTo(const QPoint &endPoint)
{
QPainter painter(&image);
painter.setPen(QPen(Qt::black,1,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin));
int fx=0,fy=0,k=0;
qPoints.clear();
connectingPointsCalculator2(qPoints,lastPoint.x(),lastPoint.y(),endPoint.x(),endPoint.y());
int i=0;
int x,y;
for(i=0;i<qPoints.size();i++)
{
x=qPoints.at(i).x();
y=qPoints.at(i).y();
painter.setPen(Qt::black);
painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
**//Updating repeatedly during the for loop:**
update(QRect(QPoint(x-5,y-5), QPoint(x+5,y+5)).normalized());//.adjusted(-rad,-rad,rad,rad));
}
modified = true;
int rad = (myPenWidth / 2) + 2;
lastPoint = endPoint;
}

Kann jemand sehen, was das Problem sein könnte?

War es hilfreich?

Lösung

Wie ich verstehe Sie min und max von x und y in der for-Schleife verarbeitet finden sollte und sie in update(QRect(QPoint(minX-5, minY-5), QPoint(maxX+5, maxY+5)).normalized());

Andere Tipps

Sorry, wenn ich falsch verstanden, aber haben Sie das „Doppelpuffer“ -Ansatz zu verwenden versucht? Statt direkt auf dem Bildschirm zeichnen, Sie „ziehen“, um Ihre Punkte und Linien auf einen Speicherpuffer. Danach kopieren Sie einfach den Puffer auf den Bildschirm. Dies ist schneller und vermeidet Flimmern.

Ich bin mir nicht sicher, was genau das Problem mit den gestrichelten Linien ist, aber ich kann Ihnen diese Beratung bieten: halten Sie den Stift herum. Statt dessen:

for(i=0;i<qPoints.size();i++)
{
    // ...
    painter.setPen(Qt::black);
    painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
    // ...
}

Sie folgendermaßen vor:

QPen black_pen(Qt::black);
for(i=0;i<qPoints.size();i++)
{
    // ...
    painter.setPen(black_pen);
    painter.drawLine(x-5,y-5,x+5,y+5); **// Drawing slanted lines**
    // ...
}

Noch mehr, wenn Sie wiederholt werden Ihre drawLineTo Funktion mit dem gleichen Stift jedes Mal aufrufen, speichern Sie den Stift in Ihrer Klasse und halten Sie sie herum. In meiner Firma haben wir das in beträchtlichem Ausmaß gefunden Ziehzeiten zu reduzieren, wo wir sie nutzen können. (Ein Beispiel auf einem großen Bild Schnitt mal in Halb Zeichnung).

Ein weiterer Hinweis: Ich bin nicht sicher, welche Art der image Sie malen, aber ich nehme an, es ein QImage ist. Wenn Sie fertig sind Zeichnung, wenn Sie das nicht modifizierte Bild wiederholt verwenden werden, können Sie es einmal zu einem QPixmap konvertieren. Die QPixmap Klasse wird in einer Weise gespeichert, die auf dem Bildschirm für Blitten direkt fertig sein soll (aber es ist viel langsamer in vielen Fällen zu ändern, weil das).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top