Lenteur2

Signaler
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Pour résumé, j'ai fait une DLL de graphisme 2D qui marche très bien. Le seul problème c'est que c'est très lent. J'utilisais SetPixel pour afficher les pixels (voir procédure dans la question lenteur) On ma suggéré d'utiliser BitBlt. Mais, corrigez moi si je me trompe, BitBlt n'est pas fait pour créé des pixels. Il ne fait que les afficher à l'écran. Donc ma question reviend à: connessez vous un moyen pour créé des pixels à l'écran sans faire ramé l'ordi. En gros sans utiliser SetPixel.

49 réponses

Messages postés
65
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
21 avril 2006

je ne programme pas en win32 directement, mais la logique semblerait que tu dois :

OnPaint(....)
{
HDC dc = GetDC( HWND [ hWnd] // handle to window);
dc.DrawCircle(...);

}

Je dis peut-être une ânerie mais avec wxWidget, il suffit de récuperer de dc et de le modifier.

D'après ce que je viens de lire, il faut ausi faire :

int ReleaseDC(
HWND [ hWnd], // handle to window
HDC [ hDC] // handle to DC
);


Donnes des nouvelles.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,

Moui, mais si tu travailles dans un DC mémoire avec SetPixel(), et
qu'ensuite tu copies tout le DC mémoire vers le DC fenetre avec
BitBlt(), c'est pas plus rapide a l'affichage ?
Messages postés
65
Date d'inscription
dimanche 27 juillet 2003
Statut
Membre
Dernière intervention
21 avril 2006

ouai, aardman a raison, c'est plus rapide, ça évite de refaire toutes les opérations de dessin.
C'etait pour qu'il comprenne bien qu'il devait agir sur le DC de la fenêtre.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Je connais pas wxWidget. Mon DLL créé des pixels avec SetPixel. Mais SetPixel fais ramé le programme. Ma question est: connaissez vous une meilleur façon d'utiliser SetPixel ou bien une façon sans SetPixel.


P.S. HDC est une structure(typedef struct HDC)?
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
D'accord mais j'utiliser déja BitBlt pour afficher les pixels créé par SetPixel. Je ne connais pas d'autre façon. Mais ça rame quand même. Selon ce que vous dite, c'est SetPixel le problème. Comment le corriger?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Pour le corriger c'est simple ne pas utiliser SetPixel !!


Pour un bete spectrographe j'ai du passer par les DIB alors qu'il me fallait juste afficher une centaine de points.


Un moteur 2D avec Setpixel est inconcevable.


Regarde la source http://www.cppfrance.com/code.aspx?id=23921


Il te suffit de faire pareil.


1 - Tu recupere ton image dans un tableau.


2 - Tu y fait tout tes traitement, avec un tableau de valeur il suffit de jouer avec les pointeurs (ya pas plus rapide)


3- Tu reaffiche tout en une seule fois avec BitBlit.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
D'accord pour ça mais, pour moi, l'image est créé par SetPixel. J'utilise SetPixel pour créé une image sur une interface vierge. J'utilise pas SetPixel pour modifier une image existant. C'est SetPixel qui créé tout. Ya pas de bitmap externe. BitBlt ne fait qu'afficher le résultat. Donc selon cette information, y a t-il un moyen de ne pas faire ramer l'ordi
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Rien ne t empeche de demarrer sur un tableau "vierge" et il n'a pas besoin d'avoir de bitmap externes.
Au lieu de faire



debut de boucle

....

SetPixel(hdc,x,y,col)

...

fin de boucle



essaye



debut de boucle

.....

tab(x+y*w)=(LPDWORD)col

(c'est tres simplifié mais ya gavé de commandes et je les ai pas toutes en tete)

.....

fin de boucle

BitBlt(......);
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Bon j'ai mit n'importe quoi.

ce serait plutot tab[x+y*largeur]=(LPDWORD)col



Et je créé mon tableau avec

LPBYTE lpBits = new BYTE[Widths*Height];



Moi je passe par les HBITMAP mais tu peux aussi passer direct par le HDC

avec CreateDIBitmap()
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Et je fait quoi avec le tableau après. Je l'insert où et comment?
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

par exemple en utilisant SetDIBitsToDevice() pour le copier dans un DC qui lui pourra utilisé avec la commande bitblit().



En resumé les API sont utilisé avant la boucle et apres la boucle.A
l'interieur de ta boucle uniquement des operation avec des pointeurs
donc tres rapide.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Je vien ENFIN de comprendre comment marchais SetDIBitsToDevice mais je ne comprend pas la structure

tab[x+y*largeur]=(LPDWORD)col

langueur et col, c'est quoi ça. J'veux dire, je comprend x et y, c'est les coordonnés mais pas largueur. J'ai une petit idée de ce quoi est col mais je voudrais en être sûre.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Ben en fait c'est un tableau a une dimension en fait c'est comme si je
faisait tab[x,y]. Mais comme on se trouve avec un tableau a une
dimension j'utilise cette astuce tres frequemment utilisé.



tableau de 5 sur 5 en 2 dimension : tab(2,3) = 8

tableu de 5 sur 5 en 1 dimension tab(2 + 3 * 5 ) = 8
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
tab(2,3) = 8
Le 8 représente quoi lui?

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

C'etait juste un exemple pris au pif; ca peut etre ce que tu veut comme
le nombre de pomme dans une etagere de x colonnes sur y rangées.C'est
pour te montrer 2 tableau ( un a une dimension et un autre a deux) mais
qui on les memes données dedans



le premier est de ce type tab(a,b)

123

456

789



le second tab(c) (avec c = a + b* 3)

123456789



Dans le code c'est les composants RGB des pixels.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
C'est des couleur 24bits? 0xFF0000 pour rouge par exemple?

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Tu connaitrait pas une source par hazard qui utilise ces même technique?

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Je crois que c'est plutot 32 bit 16 millions de couleurs la plus grosse c'est FFFFFF. Sinon c'est bien ca.

En fait si on a un pixel rouge (FF0000) suivi dun pixel bleu(0000FF)
dans ton tableau de BIT tu auras les valeurs
tab()=...,FF,00,00,00,00,FF,...

En fait si tu veut aller plus vite tu peut y lire directement un DWORD
tu lit directement les 3 octets (mais apres il faut penser a se decaler
de 3 valeurs a chaque fois), tout depend de si tu veut travailler sur
les composante rgb ou recuperer la couleur du pixel.



exemple

http://www.cppfrance.com/code.aspx?id=23921

http://www.cppfrance.com/codes/REGION-PARTIR-BITMAP_10721.aspx

http://www.codeguru.com/Cpp/G-M/bitmap/specialeffects/ (des dizaines ici)



En fait c'est simple pour traiter une image on n'utilise jamais getpixel (trop lent)

Sur le 3 eme site y a plein d'exemple : appliquer un flou, stretching etc ... toujours avec cette methode.
Messages postés
571
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
5 décembre 2013

Bon j'ai dit pas mal de conneries, confondu bit byte et octets. Mais je
viens de trouver ca quand j'avais eu le meme probleme que toi.





int tmp = y*longeur+3*x;

//et non pas y*longeur + x vu qu'il ya 3 octets a lire pour chaque pixel.



long *p = (long *)&lpBits[tmp];

if ( (unsigned)*p == RGB(255,0,0 ) { .........



ou alors

if ( (lpBits[tmp] == 255) && (lpBits[tmp+1] == 0 ) && (lpBits[tmp+2] == 0) ) { .......



Ca reviens a la meme chose mais ca te montre les deux methodes.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
J'essais de comprendre (j'te jure) mais j'ai beaucoup de difficulter. Ce que je cherche c'est comment écrire directement dans la mémoire vidéo ou avec SetDIBitsToDevice pour ne pas être obligé d'utiliser SetPixel. Tu comprend? Peut tu me faire un exemple d'un programme dessinant quelque point en couleur dans sa fenêtre avec ta technique et grâce a SetDIBitsToDevice stp?
___________________________________________
Les plus grands esprits trouvent toujours une solution