Lenteur2

SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 13 déc. 2005 à 15:21
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 14 avril 2006 à 04:52
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

kortin Messages postés 65 Date d'inscription dimanche 27 juillet 2003 Statut Membre Dernière intervention 21 avril 2006
13 déc. 2005 à 16:21
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.
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
13 déc. 2005 à 16:35
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 ?
0
kortin Messages postés 65 Date d'inscription dimanche 27 juillet 2003 Statut Membre Dernière intervention 21 avril 2006
13 déc. 2005 à 16:38
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.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2005 à 16:40
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)?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2005 à 16:43
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?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
13 déc. 2005 à 17:30
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.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2005 à 20:09
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
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
13 déc. 2005 à 20:54
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(......);
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
13 déc. 2005 à 21:04
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()
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
13 déc. 2005 à 21:10
Et je fait quoi avec le tableau après. Je l'insert où et comment?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
13 déc. 2005 à 22:40
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.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
3 avril 2006 à 19:36
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
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
4 avril 2006 à 20:06
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 avril 2006 à 22:42
tab(2,3) = 8
Le 8 représente quoi lui?

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
5 avril 2006 à 19:26
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.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
5 avril 2006 à 22:35
C'est des couleur 24bits? 0xFF0000 pour rouge par exemple?

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

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
6 avril 2006 à 19:29
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.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
6 avril 2006 à 20:01
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.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
6 avril 2006 à 20:56
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
0
Rejoignez-nous