A ne pas perdre des cycles CPU dans le un test de boucle .
Exemple .
si tu fait un compteur de 0 à 500, tu vas mettre une variable ou un registre à 0. Puis incrémenter de un jusqu'à 500 ok, mais à chaque incrementation tu vas faire un test pour savoir si tu as atteint les 500 ..
Hors si ce test prend à chaque fois 4 cycles, tu le multiplies par le nombre de fois où tu fais ce test+le saut en debut de boucle, ici c'est à dire 500. Donc (4*500)+(500*saut debut de boucle) = 3000/4000 cycles CPU voire plus .. Alors imagine une boucle de 1000 ou plus ..
La technique (qui ne peut quasiment s'appliquer qu'aux demos), consiste à mettre dans le code autant d'incrémentations pour arriver, ici à 5OO.
Donc par exemple (c'est pas du code Z80)
Code :
debut: lda #0 ; met registre A à 0 inc ; incremente A cmp #500 ; compare A à 500 (bon c'est pour simplifier comparaison word sur reg 8 bit) bne debut ; branchement à debut si pas égal à 500
est remplacé par :
Code :
lda #0 ; met registre A à 0 inc ; incremente A inc ; incremente A inc ; incremente A inc ; incremente A inc ; incremente A .... ; etc et cela 500 fois
Plus de cycles utilisé pour la comparaison et pour le retour à debut: C'est beaucoup plus rapide, mais ça prend bien plus de place aussi, et le code risque de devenir indigeste également.
Mais dans le cadre d'une demo, où les cycles sont très important, la technique vaut vraiment le coup.
Dernière édition par TOUKO le 15 Juil 2010, 13:17, édité 1 fois.
Par exemple si tu veux faire avancer un raster ligne à ligne, ce genre de technique ne fonctionnera pas.
Par contre, dans des cas bien particulier d'optimisation (et s'il me reste de la place en mémoire), Il peut m'arriver d'utiliser ce type de technique moi aussi
C'est vrai, j'avait vu une utilisation massive de cette technique pour une demo C64, ou le mec voulait faire un plasma, et franchement le gain était spectaculaire.
Inscription : 15 Août 2008, 13:00 Message(s) : 968 Localisation : Troyes, France
Ah d'accord , c'est ça.Oui alors , c'est quelque chose que j'utilise surtout pour l'affichage graphique où je déroule les boucles quand j'utilise avec des sprites à taille fixe (1*1 char ou 2*2 char)
_________________ "NOP" tel est le programme parfait ! court, rapide, lisible et sans bugs (connus)
raaah vous étes chiants les demos-maker, vous pouvez pas vous mettre d'accord sur les termes ???
Lol, ça sent encore la rivalité C64/CPC tout ça . Les mecs ont même fait des scripts qui insèrent ces trucs directement dans le code source, tellement c'est chiant
Inscription : 12 Juin 2008, 20:29 Message(s) : 1715
Bah, bien sûr qu'on l'utilise aussi sur notre z80 limité...en mhz !!!
Généralement, j'écris le code comme cela :
1) algo général (en gros ce que le prog doit faire) 2) speudo-code en français 3) conversion en z80 (à ce moment là, j'aurai pu écrire en n'importe quel language asm ou autre !!!) 4) ça marche ? passage au 5) 5) j'optimise le code... ca marche tjs ? passage au 6) 6) je regarde ce qui prend du temps dans le code -> j'optimise (retourner au 6 tant qu'on est pas satisfait) 7) ca y est, alors on peut encore optimiser en speedcode (ou loop unroll) ! Généralement, je fais ça en dernier car c'est généralement consommateur en mémoire et c'est là qu'on voit vraiment si c'est la peine (car si on tient déjà dans la vbl c'est inutile !!! )
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité
Vous ne pouvez pas publier de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas insérer de pièces jointes dans ce forum