2010-06-14 4 views
2

J'avais besoin d'aide pour essayer d'optimiser cette portion de code ... En gros, voici la chose .. Je fais ce 'stylo de calligraphie' qui donne l'effet de calligraphie en dessinant simplement beaucoup de lignes inclinées adjacentes ... Le problème est le suivant: Lorsque je mets à jour la région draw en utilisant update() après chaque tirage d'une ligne inclinée, la sortie est correcte, en ce sens que les mises à jour sont faites en temps opportun, de sorte que tout «dessiné» en utilisant le stylo est immédiatement «vu» le dessin .. cependant, parce qu'un lot (100s d'entre eux) des mises à jour sont faites, le programme ralentit un peu lorsqu'il est exécuté sur le N900 ...Besoin d'aide pour optimiser un code de dessin ...

Lorsque j'essaie de faire un peu d'optimisation en exécutant la mise à jour après avoir dessiné tous les lignes inclinées (de sorte que toutes les lignes sont mises à jour sur la planche à dessin via une seule mise à jour()), la sortie est ... impair .... Autrement dit, immédiatement après avoir dessiné les lignes, elles semblent brisées (elles ont patchs vacants où le dessin aurait dû se produire aussi) ... cependant, si je déclenche un redessin de la fenêtre de formulaire (disons, en changeant la taille du formulaire), les patches cassés sont immédiatement corrigés !! Lorsque j'exécute ce programme sur mon N900, il obtient la sortie brisée initiale et reste ainsi, car je ne sais pas comment appliquer un redessin dans ce cas ...

Voici le premier code 'optimisé' et sortie (partiellement correcte/incorrecte)

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

image juste après griffonner sur l'écran:

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

après re-réglage de la taille de la fenêtre, tous les liens cassés ci-dessus sont fixés comme ils devraient être.

Voici le second code non optimisé (sa sortie est juste correct après le dessin, comme dans la deuxième image ci-dessus):

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

Quelqu'un peut-il voir ce que la question pourrait être? approche

Répondre

1

Si je comprends bien, vous devriez trouver min et max de x et y traitées dans votre boucle for et les utiliser dans update(QRect(QPoint(minX-5, minY-5), QPoint(maxX+5, maxY+5)).normalized());

+0

D'accord, je viens de l'essayer ... Il est bon que ça marche maintenant sur mon PC ... avec juste une mise à jour après la boucle for, ça marche toujours bien sur le PC ... mais quand je le lance sur le N900, le résultat n'est pas bon ... En dessinant 100% de lignes verticales, quelle que soit la rapidité, elles sont toujours pleines, sans "cassures" ... mais quand je dessine horizontalement des lignes semi-horizontales, il y a des cassures , même si je dessine la ligne * très * lentement ... – Ahmad

2

Désolé si je mal compris, mais avez-vous essayé d'utiliser le « double tampon »? Au lieu de dessiner directement sur l'écran, vous "dessinez" vos points et vos lignes dans un tampon mémoire. Après cela, il vous suffit de copier le tampon à l'écran. Ceci est plus rapide et évite le scintillement.

+0

Avez-vous une idée de ce que cela peut être fait en Qt, car j'apprends encore Qt ... – Ahmad

+0

Je ne suis pas un spécialiste de Qt, mais je J'ai trouvé ce lien: http://doc.trolltech.com/qq/qq06-flicker-free.html. Je pense que ça peut être utile. – Juliano

+0

Depuis la version 4.0, Qt double-tamponne le dessin par défaut. Vous devez le désactiver explicitement si vous voulez un dessin non-bufférisé. http://doc.trolltech.com/4.0/qt4-arthur.html –

1

Je ne sais pas exactement quel est votre problème avec les lignes brisées, mais je peux vous offrir ce conseil: gardez votre stylo. Au lieu de cela:

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

faire:

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** 
    // ... 
} 

Encore plus, si vous appelez à plusieurs reprises votre fonction drawLineTo avec le même stylo chaque fois, ranger le stylet dans votre classe et garder autour. Chez moi, nous avons constaté que cela réduisait énormément les temps de dessin où nous pouvions en profiter. (Une instance sur une grande image réduit les temps de dessin de moitié.)

Une autre remarque: Je ne suis pas sûr du type de peinture que vous peignez, mais je suppose qu'il s'agit d'une QImage. Lorsque vous avez terminé de dessiner, si vous utilisez l'image non modifiée à plusieurs reprises, vous pouvez la convertir une fois en QPixmap.La classe QPixmap est stockée d'une manière qui est supposée être prête pour le blitting directement à l'écran (mais beaucoup plus lent à modifier dans de nombreux cas, à cause de cela).

Questions connexes