14Fermer16
ZerosquareLe 12/08/2012 à 16:39
xCeLfr (./13) :
Maintenant j'aimerais comprendre les différentes technique d'optimisation, j'ai déjà lu qu'il fallait remplacer les div et mul par des opérations binaires ?
Oui, c'est le premier truc indispensable, parce qu'avec des mul et des div ton code va être effroyablement lent smile

Les équivalences pour les nombres non signés :
• Multiplier par 2N : décaler de N bits vers la gauche.
• Diviser par 2N : décaler de N bits vers la droite.
• Calculer le reste de la division par 2N : faire un AND avec (2N - 1).
• Arrondir au multiple de 2N supérieur : ajouter (2N - 1), puis faire un AND avec (NOT ((2N - 1)).

Pour optimiser tes multiplications par une constante, tu peux :
• décomposer la multiplication : par exemple, x * 160 = x * 5 * 32 = ((x * 4) + x) * 32 = ((x * 22) + x) * 25. À partir de là, voir ci-dessus.
• si tu as de la place en mémoire et que la plage de valeurs de x n'est pas trop grande, précalculer une table de multiplication.

Pour optimiser tes divisions par une constante, tu peux :
• multiplier par l'inverse : au lieu de diviser x par y, tu multiplies x par (2N / y), puis tu divises par 2N (plus N est grand, plus c'est précis, mais attention à ne pas dépasser la valeur maximum d'un entier).
• comme pour la multiplication, utiliser une table de division précalculée.

L'optimisation suivante, c'est d'inclure la routine qui affiche un pixel dans la fonction appelante. Par exemple, pour tracer une ligne, tu ne vas plus appeler la fonction "pixel" pour chaque point, mais chercher à tracer plusieurs points d'un coup et économiser beaucoup de calculs (parce que si tu connais la position en mémoire du point précédent, celle du point suivant est calculable de manière beaucoup plus simple).