Line To rapide

Signaler
Messages postés
132
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
27 novembre 2012
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Salut,

Je fait plusieurs occurence de
MoveTo + LineTo sur un CDC.

Est-il possible d'optimiser LineTo avec une autre fonction ?

J'avais essayé en passant part un MetaFile et en le copiant après dans mon CDC - > Hyper Lent.

En fait je fait un OScillo. Pour avoir un effet persistant, j'efface la courbe précedente et affiche ensuite la nouvelle.

J'ai environs un millier de Ligne en fait dans certains cas : 4000 lignes

Effacement OldLigneVoie1 // 1000 Lignes en tout
Effacement OldLigneVoie2 // 1000 Lignes en tout
Affichage NewLineVoie1 // 1000 Lignes en tout
Affichage NewLineVoie2 // 1000 Lignes en tout

Je suis sur qu'on peut mieux faire.

J'avais essayé d'effacer entierement l'ecran et de redessiner dessus la nouvelle courbe, mais ca donne un effet de clignotement et on ne voit pas la fin de la courbe (ce qui est logique)...

BitBlt ? j'y pensai aussi, mais selon moi c'est un peu comme les MetaFiles, en plus cela risque la aussi de donner un effet de clignottement (d'autant que parfois les données à afficher peuvent arriver très lentement...)

Voilà si quelqu'un à une idée ....

(BruNew par exemple ?? ) je sais qu'il traine partout et qu'il est toujour de bon conseil...
Merci pour ton jeu d'instruction ASM.

Je pensais d'ailleur utiliser l'assembleur pour ecrire directement dans le CDC, mais je sais pas vraiment comment faire. en DELPHI, et BORLAND il existe apparament une fonction ScanLine permettant de recuperer l'adresse du CDC et d'ecrire directement (???) dedans ...

VOilà si quelqu'un à des conseils, merci à tous....

RAppel ; optimisation de MoveTo - LineTo ....
;)

8 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Salut,
je suis vraiment deborde en ce moment.
Tu as regarde ma source qui ecrit en sinusoidal, c'est ni MFC ni LineTo mais le principe est le meme. Trace sur un memorydc et plaque en 1 fois avec BitBlt. Pas besoin d'effacer avant puisque tu plaques la surface a chaque fois, aucun scintillement.
BruNews, ciao...
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
En utilisant le double-buffering, tu éviteras le scintillement lors du dessin (des sources déposées recemment le mette en oeuvre)
Messages postés
132
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
27 novembre 2012
1
Merci à tous j'essayerai dès que possible...

(un peu insomniaque ca me travaille, j'arrive pas à dormir.) Je viens de me relever pour tester un truc avec BitBlt

Merci .....
Messages postés
132
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
27 novembre 2012
1
Il est où le probleme... ?
Mon ecran est blanc, mais mes lignes ne sont pas affichées ...

void AfficheEcran(CDC *pDC1, CRect rectValue, bool Refresh)
{
int i;
CPen* Pen1 = new CPen(),*OldPen;
CPen* Pen2 = new CPen();
CPen* Pen3 = new CPen();

CDC pDC;
pDC.CreateCompatibleDC(pDC1);
pDC.PatBlt(0, 0, rectValue.right, ectValue.bottom,WHITENESS );

for(i=1;i<=10;i++)
{
pDC.MoveTo(i * rectValue.right/10,0);
pDC.LineTo(i * rectValue.right/10,rectValue.bottom);
}

pDC1->BitBlt(0,0,rectValue.Width(),rectValue.Height(),&pDC,rectValue.right,rectValue.bottom,WHITENESS );

delete Pen1;
delete Pen2;
delete Pen3;
}
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Il faut créer un bitmap et le sélectionner dans le DC en mémoire :

int cx = rc.Width();
inr cy = rc.Height();

CDC memDC;
memDC->CreateCompatibleDC(pDC1);
CBitmap memBmp;
memBmp.CreateCompatibleBitmap(pDC1, cx, cy);
CBitmap* pOldBmp = memDC.SelectBitmap(&memBmp);

...
dessin dans memDC
...

pDC1->BitBlt(rc.left,rc.top,cx,cy,&memDC,0,0,SRCCOPY)

memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBmp.DeleteObject();
Messages postés
132
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
27 novembre 2012
1
MErci j'essayerai peut-etre ca ce soir... Sinon ce sera après les vacances de decembre ... J'AI PRIS DEUX SEMAINES.... ENFIN LES CONGÉS....

Allez bonnes vacances et merci pour tout.....

A l'année prochaine.....

Meilleurs VOEUX
:big)
Messages postés
132
Date d'inscription
mercredi 6 mars 2002
Statut
Membre
Dernière intervention
27 novembre 2012
1
Voila....

bonne année a tous...

J'ai essayé ca fonctionne sauf .....

Je voudrais ne pas ecraser l'image mais coller l'image par dessus. Le probleme, c'est qu'en initialisant mon CBitmap, je crée l'image complete.

par exemple j'ai une courbe en tache de fond, et j'aimerai y appliquer un quadrillage avec BitBlt. est-il possible de rendre toutes les zones du CBitmap transparente mise a part les traits et les lignes du quadrillage ????

Merci et @+
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
voici une méthode pour dessiner en transparence

utilisation d'un masque de l'image à insérer :
- image noir et blanc
- un pixel noir si le pixel correspondant de l'image est à afficher
- un pixel blanc si le pixel correspondant de l'image est transparent

ET entre 2 DC : hdcDest = hdcDesT ET hdcSrc
Blt(hdcDest, 0, 0, cx, cy, hdcSrc, 0, 0, SRCAND)

OU entre 2 DC : hdcDest = hdcDesT OU hdcSrc
Blt(hdcDest, 0, 0, cx, cy, hdcSrc, 0, 0, SRCPAINT)

5 DC :
dcBack : fond
dcInsert : image à insérer
dcMask : masque positif de l'image (noir pour les pixels à afficher)
dcFinal : image finale
dcTemp : dc temporaire

Blt(dcTemp, dcMask, NOTSRCCOPY) dcTemp = NOT dcMask (masque négatif)
Blt(dcTemp, dcInsert, SRCAND) dcTemp = dcTemp ET dcInsert
Blt(dcFinal, dcBack, SRCCOPY) dcFinal = dcBack
Blt(dcFinal, dcMask, SRCAND) dcFinal = dcFinal ET dcMask
Blt(dcFinal, dcTemp, SRCPAINT) dcFinal = dcFinal OU dcTemp

toutes les opérations ne sont pas à faire à chaque fois (on peut optimiser)
- si le bitmap à insérer est toujours le meme, les 2 premiers Blt ne sont
à faire qu'une fois à l'init
- le dcBack peut être écrasé s'il ne sert à rien après (au lieu d'en faire une
copy).

--------------------------------------------------
opération sur les couleurs :

couleur ET noir = noir
couleur ET blanc = couleur

couleur OU noir = couleur
couleur OU blanc = blanc

ex avec 16 couleurs :
0 : noir
9 : rouge
C : bleu
D : violet
F : blanc

image de fond (bleu):
C C C C C
C C C C C
C C C C C
C C C C C

image à insérer (rectangle rouge, avec violet comme couleur transparente) :
D D D D D
D 9 9 9 D
D 9 9 9 D
D D D D D

masque positif et négatif :
F F F F F 0 0 0 0 0
F 0 0 0 F 0 F F F 0
F 0 0 0 F 0 F F F 0
F F F F F 0 0 0 0 0

--------------------------------------------------
solution 1 :
(insert OU maskPos) ET (fond OU maskNeg)
F F F F F C C C C C C C C C C
F 9 9 9 F C F F F C C 9 9 9 C
F 9 9 9 F C F F F C C 9 9 9 C
F F F F F C C C C C C C C C C

--------------------------------------------------
solution 2 :
(insert ET maskNeg) OU (fond ET maskPos)
0 0 0 0 0 C C C C C C C C C C
0 9 9 9 0 C 0 0 0 C C 9 9 9 C
0 9 9 9 0 C 0 0 0 C C 9 9 9 C
0 0 0 0 0 C C C C C C C C C C

j'espère que c'est clair, sinon le mieux c'est de faire un dessin à la main en testant les opérations logiques