1

Yop smile

Ze voudrais savoir quelles méthodes en C Lynx on peut utiliser pour grapiller un peu de vitesse...

Exemple : il vaut mieux une pré-incrémentation ++valeur; qu'une post-incrémentation valeur++;, des trucs dans ce genre...

Actuellement, je me tâte entre :

++animation;
switch (animation% 3) { case 0: case 1: case 2: }

ou

++animation;
if (animation == 3) { animation = 0; }
switch (animation) { case 0: case 1: case 2: }

Ça vaut le coût d'employer des modulo ?
L'exemple est plutôt mauvais, car même en cas de modulo, je dois réinitialiser la valeur à 0 pour ne pas bourrer un uchar animation;.

Vous avez d'autres petites astuces comme cela ?

2

Des modulos, c'est des divisions, c'est ce qu'il y a de pire. Un astuce simple : plutôt que de faire des compteurs incrémentals (a++), utiliser des décompteurs vers 0. Pourquoi ? Parce qu'il n'y à qu'un chargement (valeur de départ) et à chaque décrémentation, les flags de status sont modifiés automatiquement. Ducoup, à la fin de la boucle, le bit Z est mis, et un simple BEQ fait l'affaire, sans avoir de CMP avec la valeur max (qui nécessite un chargement ou l'occupation d'un registre) dans le cas d'une incrémentation...

Kochise, le mec qui écrit son propre assembleur et qui découvre des choses, mais alors des choses...
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

3

OK, je viens de relire ton post, et je vois que tu as 3 étapes d'animation. Fondamentalement, c'est pas dans le choix de l'étape d'animation que tu vas gratter énormément, puisque ça ne représente qu'une part infime du travail d'affichage. Le plus rapide sera évidement une routine de branchement de type dichotomique :

/* unsigned char */ l_nAnim = l_nAnim + 1;
/* unsigned char */ l_nMask = 0x02;

if((l_nAnim & l_nMask) == 0)
{ /* Etape 0 *ET* 1 */
l_nMask = l_nMask >> 1; /* On décale le masque pour tester les étapes 0 *OU* 1 */

if((l_nAnim & l_nMask) == 0)
{ /* Etape 0 */
...
}
else
{ /* Etape 1 */
...
}
}
else
{ /* Etape 2 *ET* 3 */
l_nMask = l_nMask >> 1; /* On décale le masque pour tester les étapes 2 *OU* 3 */

if((l_nAnim & l_nMask) == 0)
{ /* Etape 2 */
...
}
else
{ /* Etape 3 */
l_nAnim = 0; /* On ré initialise le compteur d'animation */
}
}

Bon, évidement, quand tu n'as QUE 3 étapes, le gain n'est pas bien important, mais on passe quand même de 3 tests max (quand tu as l_nAnim == 2) à maximum 2 tests (et encore tu économise le test de départ pour savoir si l_nAnim == 3). Si tu avais 256 étapes, plutôt que d'avoir 256 tests maximum, tu n'en aurais que 8 tout au plus. Par contre il faut 'dérouler' les tests de façon dichotomique (0-127/128-255, puis 0-63/64-127 et 128-191/192-255, ...) et non plus linéairement (0, 1, 2, 3, ...) !

Autre avantage ducoup, la vitesse de traitement est linéaire et prédictive, puisque tu sais qu'il y auras TOUJOURS 8 tests pour déterminer l'étape d'animation, contre 1 lorsque tu est à la première étape, et 256 quand tu est à la dernière.

Kochise, grand amateur d'algorithmes épicés smile
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

4

Evidement, si le forum me pourri mes indentations, y'a encore GT qui vas dire que le C, c'est d'la merde et qu'on y comprend rien...

/* unsigned char */ l_nAnim = l_nAnim + 1; 
/* unsigned char */ l_nMask = 0x02; 

if((l_nAnim & l_nMask) == 0) 
{ /* Etape 0 *ET* 1 */ 
  l_nMask = l_nMask >> 1; /* On décale le masque pour tester les étapes 0 *OU* 1 */ 

  if((l_nAnim & l_nMask) == 0) 
  { /* Etape 0 */ 
    ... 
  } 
  else 
  { /* Etape 1 */ 
    ... 
  } 
} 
else 
{ /* Etape 2 *ET* 3 */ 
  l_nMask = l_nMask >> 1; /* On décale le masque pour tester les étapes 2 *OU* 3 */ 

  if((l_nAnim & l_nMask) == 0) 
  { /* Etape 2 */ 
    ... 
  } 
  else 
  { /* Etape 3 */ 
    l_nAnim = 0; /* On ré initialise le compteur d'animation */ 
  } 
}


Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

5

Kochise
: Evidement, si le forum me pourri mes indentations, y'a encore GT qui vas dire que le C, c'est d'la merde et qu'on y comprend rien...



Enfin meme indenté j'y arrives pas, a comprendre donc.....



GT Mort de rire grin
avatar
Accrochez vous ca va être Cerebral !!

6

La même chose en GFA, mécréant :

l_nAnim%=l_nAnim%+1
l_nMask%=&H02
 
IF ((l_nAnim% AND l_nMask%) = 0)
  ' Etape 0 *ET* 1
  ROR(l_nMask%,1) ' On décale le masque pour tester les étapes 0 *OU* 1

  IF ((l_nAnim% AND l_nMask%) = 0)
    ' Etape 0
    ...
  ELSE 
    ' Etape 1
    ...
  ENDIF
ELSE
  ' Etape 2 *ET* 3
  ROR(l_nMask%,1) ' On décale le masque pour tester les étapes 2 *OU* 3

  IF ((l_nAnim% AND l_nMask%) = 0)
    ' Etape 2
    ...
  ELSE 
    ' Etape 3
    l_nAnim%=0 ' On ré initialise le compteur d'animation
  ENDIF
ENDIF


Bwa alors ? C'est quoi de si différent ?

Kochise
avatar
Si Dieu m'a de nouveau fait homme, cette fois il m'a pas raté : marcher sur l'eau et dupliquer les pains, ça marche p'us :/

7

Pour info, il y a ce qu'il faut pour balancer une source wink : /* unsigned char */ l_nAnim = l_nAnim + 1;   /* unsigned char */ l_nMask = 0x02;     if((l_nAnim & l_nMask) == 0)   { /* Etape 0 *ET* 1 */     l_nMask = l_nMask >> 1; /* On décale le masque pour tester les étapes 0 *OU* 1 */       if((l_nAnim & l_nMask) == 0)     { /* Etape 0 */       ...     }     else     { /* Etape 1 */       ...     }   }   else   { /* Etape 2 *ET* 3 */     l_nMask = l_nMask >> 1; /* On décale le masque pour tester les étapes 2 *OU* 3 */       if((l_nAnim & l_nMask) == 0)     { /* Etape 2 */       ...     }     else     { /* Etape 3 */       l_nAnim = 0; /* On ré initialise le compteur d'animation */     }   }
Ca colorise et ça encombre moins le post, que du bien wink

(source à droite du formulaire de saisie de posts)
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

8

Bon, ben merci smile
c'est un chouillat moins lent, mais ya encore du taf... j'aurais jamais le temps de faire un truc valable, mais preview la semaine prochaine.