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

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
7 avril 2006 à 19:00
ben si tu veut colorier en rouge le pixel de coordonnée 8,7 d'un tableau de 10 sur 10.



int tmp = 7*10+3*8;

lpBits[tmp] = 255;

lpBits[tmp+1] = 0;

lpBits[tmp+2] = 0;
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 avril 2006 à 22:18
D'accord et après j'utilise ce tableau avec SetDiBitsToDevice. Mais pourrais tu m'expliquer:
lpBits[tmp+1] = 0;
lpBits[tmp+2] = 0;

___________________________________________
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
7 avril 2006 à 22:46
Corrige moi si je fais des erreures

BYTE test[10*10];

int tmp = 7*10+3*8;
lpBits[tmp] = 255;
lpBits[tmp+1] = 0; /* pourquoi */
lpBits[tmp+2] = 0; /* pourquoi */

SetDIBitsToDevice(hDC, 0, 0, 10, 10, 0, 0, 0, 10, lpBits, NULL, DIB_RGB_COLORS);

___________________________________________
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
7 avril 2006 à 22:48
C'est pas BYTE test[10*10] c'est BYTE lpBits[10*10]

___________________________________________
Les plus grands esprits trouvent toujours une solution
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
7 avril 2006 à 22:52
Oki
lpBits[tmp+1] = 0;
lpBits[tmp+2] = 0;
sont les valeur en BYTE de vert et de bleu. Mais peut tu me dire si mon codage est bon?

___________________________________________
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
7 avril 2006 à 23:47
Bon j'ai fais ceci pour afficher trois pixel a l'écran. Ça marche mais premièrement, les coordonné sont à l'enver, les point ne sont pas au bonne endroit (même a l'enver), et sont jaune plutot que mauve (0xFF00FF)
BITMAPINFO dib;

ZeroMemory(&dib, sizeof(dib));

dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
dib.bmiHeader.biHeight = 150;
dib.bmiHeader.biWidth = 150;
dib.bmiHeader.biPlanes = 1;
dib.bmiHeader.biBitCount = 24;
dib.bmiHeader.biCompression = BI_RGB;
dib.bmiHeader.biSizeImage = 0;
dib.bmiHeader.biXPelsPerMeter = 150;
dib.bmiHeader.biYPelsPerMeter = 150;
dib.bmiHeader.biClrUsed = 0;
dib.bmiHeader.biClrImportant = 0;

BYTE *test = (BYTE*)malloc(500*500);

int tmp = 50*500+3*5;
test[tmp] = 255;
test[tmp+1] = 0;
test[tmp+2] = 255;

tmp = 50*500+3*6;
test[tmp] = 255;
test[tmp+1] = 0;
test[tmp+2] = 255;

tmp = 50*500+3*7;
test[tmp] = 255;
test[tmp+1] = 0;
test[tmp+2] = 255;

SetDIBitsToDevice(memhDC, 0, 0, 150, 150, 0, 0, 0, 150, test, &dib, DIB_RGB_COLORS);

free(test);

J'utilise l'allocation dynamique pour être capable d'allouer de grosse espace mémoire mais ça revien au même.

___________________________________________
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
8 avril 2006 à 13:29
En fait il te faut faire un tableau exactement de la bonne taille.

Si tu as les pixels

123

456

789

mais que tu les met dans un tableau de 4 par 4 ca va devenir

1234

5678

9000



et c'est encore pire vu que tu peut aussi decaler les composant rgb, donc avoir des couleurs differentes



Toi tu travaille sur un truc de 150*150 mais un tableau de 500*500.

DWORD dwWidthBytes = 4*((3*longeur+3)/4); //cherche pas a comprendre la
formule c'est une technique pour avoir le multiple de 4 directement
superieur.

LPBYTE lpBits = new BYTE[dwWidthBytes*largeur];
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 avril 2006 à 14:52
D'accord d'accord. Mais la formule pour placer les pixel (y*150+3*x) est-elle correct? Car ça affiche n'importequoi. Tien voici ce que j'ai fait

BITMAPINFO dib;
ZeroMemory(&dib, sizeof(dib));

dib.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
dib.bmiHeader.biHeight = -150;
dib.bmiHeader.biWidth = 150;
dib.bmiHeader.biPlanes = 1;
dib.bmiHeader.biBitCount = 24;

DWORD bytewidth = 4*((3*150+3)/4);

BYTE *test = (BYTE*)malloc(bytewidth*150);

int tmp = 0;
int x = 0;
int y = 0;

while(y < 50)
{
while(x < 50)
{
tmp = y*150+3*x;
test[tmp] = 255;
test[tmp+1] = 0;
test[tmp+2] = 255;
x++;
}
y++;
x=0;
}

SetDIBitsToDevice(memhDC, 0, 0, 150, 150, 0, 0, 0, 150, test, dib, DIB_RGB_COLORS);

free(test);

C'est sensé dessiner un cube de 50pixel sur 50pixel. Or ça remplie toute la longuer (150 pixel) et ça ne va pas jusqu'a 50 pixel sur l'axe des y

___________________________________________
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
8 avril 2006 à 15:28
Tien j'ai remplacer BYTE *test = (BYTE*)malloc(bytewidth*150);
par
BYTE *test = (BYTE*)malloc((bytewidth*sizeof(BYTE))*(150*sizeof(BYTE)));
pour avoir une taille exacte mais ça ne change rien.

___________________________________________
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
8 avril 2006 à 18:02
Ben il me faudrais refaire le reste du code pour tester, je vais voir
si je retrouve une base deja faite pour tester mais tu as quoi en fait
une seule ligne de pixel ? C'est la bonne couleur (si oui on est sur le
bon chemin) ??.
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
8 avril 2006 à 18:09
dib.bmiHeader.biHeight = -150; pkoi un truc negatif ?

Tu as tout rechangé ? Pourtant pour moi ca avait l'air bon !!
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
8 avril 2006 à 18:43
Négatif pour inverser la position des y sinons tout est a l'envers

___________________________________________
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
8 avril 2006 à 18:45
Et jai des lignes de pixel empiler une par dessus les autre qui couvre toute la longuer du tableau et qui change de couleur de ligne en ligne

___________________________________________
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
9 avril 2006 à 11:19
Pour inverser la position des Y

tmp = (150-y)*150+3*x;

tout simplement.



Ensuite je coirs que c'est

SetDIBitsToDevice(memhDC, 0, 0, 150, 150, 0, 0, 0, 150, test, &dib, DIB_RGB_COLORS);



Et a pars que moi j utilise new a la place de malloc et que donc je
passe &lpbit a la place de lpbit je voit pas pourquoi cela ne
marcherait pas.



teste dib.bmiHeader.biBitCount = 32; mais chez moi j utilise 24 aussi.



En fait tu as obligatoirement un decalage dans ton tableau de pixel
mais pour savoir a quel niveau il te faut debugger ou bidouiller (
essaye d'afficher une diagonale au lieu d'un carré)
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
9 avril 2006 à 15:15
Ben tu vois si je fais tmp = (150-y)*150+3*x; il me les décale seulement et la position 0,0 se retrouve a 0,120. Aussi si je fais &lpBit soit avec malloc ou new, ya plus rien du tout qui saffiche. Ensuite si justilise dib sans & c simplement que le dib est défiinie dans un autre programme et envoyer en param à la fonction qui utilise SetDIBitsToDevice. Sinon change 24 par 32 ne change rien non plus. On dirais qu'il part simplement d'un point, qu'il remplie la ligne et une fois remplie, il saute a l'autre et fais pareille.

___________________________________________
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
9 avril 2006 à 15:16
Tien va voir la. C'est un print screen du resultat.

http://seri-a.4t.com/Sans%20titre.JPG

___________________________________________
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
9 avril 2006 à 15:17
Ah non pas la. L'image est interdite. Une seconde.

___________________________________________
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
9 avril 2006 à 15:21
Ok j'ai mit l'image sur une page

http://seri-a.4t.com/Doc2.htm

___________________________________________
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
10 avril 2006 à 18:46
"tu vois si je fais tmp = (150-y)*150+3*x; il me les décale seulement
et la position 0,0 se retrouve a 0,120" alors ya un gros probleme car
si je fait les calculs a la main



pour tmp = y*150+3*x

pour p(0,0) >> tmp=0

pour p(0,150) >tmp = 22500



pour tmp = (150-y)*150+3*x

pour p(0,0) >> tmp=22500


pour p(0,150) >tmp = 0



C'est exactement l'inverse c'est impossible de se retrouver en (0,120).Tu doit avoir un probleme dans le reste du code.
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
10 avril 2006 à 18:50
Nah c'est probablement à cause de l'affichage. Mais je comprend toujours pas pourquoi ça fait cette effet la. A tu vu l'image?

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
Rejoignez-nous