Bonjour à tous, j'ai besoin d'un coup de main pour optimiser mon code.
Je vous explique. J'ai besoin de générer un masque de collisions de différentes formes. Pour cela j'ai créé un tableau de la taille du plateau, dans lequel j'utilise des unsigned char (32 bits) pour que je puisse stocker 32 informations binaire 0/1 : soit un pixel est occupé, soit il est libre.
Donc j'initialise mon tableau avec un memset pour tout mettre à 0.
J'ai aussi créé des tableaux pour représenter les pixels de mes objets, par exemple un cercle.
Voici la fonction que j'utilise pour copier les bits d'un cercle dans le plateau :
Vous remarquerez que j'ai essayé d'optimiser un peu déjà. Avant j'utilisais naïvement un int pour chaque valeur 0/1 des pixels, et ça a déjà bien amélioré les choses de passer aux nombres binaires stockés dans une variable 32 bits. J'en viens à ma question : est il possible d'optimiser les choses et existe t il une fonction pour ne pas avoir à passer les valeurs bit à bit ? Car il peut y avoir du décalage : un pixel de cercle peut être affecté au 9ème pixel d'un octet du plateau.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 void plateau_cercle(int i,int j){ unsigned char mbitMin,mnum,mbit; unsigned char cbitMin,cnum,cbit; int xc,yc,ym; unsigned int *z; unsigned int *c; /* ici je calcule la position théorique dans laquelle je vais copier le cercle dans le plateau car l'image du cercle fait 128x128 */ int xmin=i,xmax=i+128,ymin=j,ymax=j+128; /* ici je calcule la position du cercle qui va m'interesser */ int cxmin=0;int cymin=0;int cxmax=128;int cymax=128; /* ici je teste si je ne suis pas en dehors des limites */ /* TPCX et TPCY sont les tailles maxi du plateau */ if (xmin<0) {cxmin=xmin * -1;xmin=0;} if (xmax>TPCX) {cxmax=128 - xmax +TPCX;xmax=TPCX;} if (ymin<0) {cymin=ymin * -1;ymin=0;} if (ymax>TPCY) {cymax=128 - ymax +TPCY;ymax=TPCY;} /* ici je cherche sur quel octet je vais commencer et sur quel bit */ mnum = xmin/32 ; mbit = mbitMin = xmin - (mnum * 32); cnum = cxmin/32; cbit = cbitMin= cxmin - (cnum * 32); ym=ymin; yc=cymin; /* je reutilise xmax pour boucler sur les y */ xmax=cymax - cymin; xmin=cxmax - cxmin; /* je boucle pour tous les y qui m'interessent */ while(xmax--){ /* je me positionne sur le bon octet du plateau */ z=(unsigned int *)(&plateau.masque_cercle[ym*TPCX32 + mnum]); mbit=mbitMin; cbit=cbitMin; /* je me positionne sur le bon octet du cercle */ c=(unsigned int *)(&cercle_32[yc * 4 + cnum]); xc=xmin; /* pour chacun des bits */ while (xc--){ if ((*c >> cbit) & 1) {*z &= ~ (1 << mbit);} mbit++;if (mbit>31){z++;mbit=0;} cbit++;if (cbit>31){c++;cbit=0;} } ym++; yc++; } }
Merci pour votre aide !
Partager