effectivement, il faut probablement rajouter une parenthèse.
pour la vitesse oui un "call" (appel de sous-fonction) par pixel dans une routine travaillant au niveau pixel réduirait dramatiquement les performances, même sur un cpu actuel (ni les CPU ni les optimisations de carte 3D ne compensent des erreurs de programmation)
ensuite la pluspart des compilateurs C ou C++ font de l'expansion en ligne automatique, donc si tu mets toutes les options d'optimisations et ça devrait aller (au pire tu contrôles le code généré en assembleur). Même pas forcément besoin d'un inline.
ensuite si tu veux booster y'a une méthode plus simple pour gagner du temps:
unsigned char *Buffer=surface->pixels;
et tu te balades avec un Buffer[....]
ensuite vu que tu risques de faire des for, je te conseilles une approche type:
Code :
- unsigned char *Buffer=surface->pixels;
- int i=hauteur;
- do {
- int j=largeur;
- unsigned char *Ptr=Buffer; // ligne courante
- // traitement pixel par pixel
- do {
- *Ptr=traitement(*Ptr);
- Ptr++;
- } while(--j);
- Buffer+=largeur; // ligne suivante
- } while(--i);
|
1) effectivement éviter les "call", si le compilo fait de l'expension en ligne, pas de problème....
2) remonter tout ce qui est constant dans la boucle la plus imbriqué pour refaire monter le calcul des constantes dans les boucles supérieures... (par exemple remonter des calculs de constante propres à chaque ligne dans le while() des lignes)
3) éviter les calcul d'adresse par des multiplications genre [y*largeur+x], favoriser des incrémentations/addition de pointeurs....
4) tables de précalcul...
pour gagner du temps il ne faut pas chercher à avoir un foncion putpixel/getpixel rapide, mais à avoir la routine qui traite un bloc de pixel relativement bien optimisée)
Pour booster, il faut pas penser un routine qui traite un élément, mais une routine qui traite un "tableau" d'éléments....
Message édité par bjone le 05-07-2002 à 18:06:20