Vous n'êtes pas identifié.
unsigned char scr[64][63]; unsigned char scr2[64][63];
comment je fais pour copier tout le contenu de scr2 dans scr? 8O
Sans passer par une boucle for si possible, parce que ca:
for(i=0;i<=64;i++) for(j=0;j<=63;j++) scr[i][j]=scr2[i][j];
C'est VRAIMENT TROP LENT.
Y'a une fonction qui doit s'appeller memcpy (cherche dans l'aide de TC) qui doit faire ça mais je sais pas si ça ira vraiment plus vite.
Hors ligne
facile à dire! tu t'y prends comment?
(je sens que je vais d/l des cours d'asm)
Hors ligne
Ben je vais pas t'expliquer en détail, mis tu garde ton imbrication de boucles en C (pske les instructions de saut en ASM inline ca merde) mais tu remplace les instructions de copie des éléments opar de l'ASM. Je vais pas te faire un cours: il faut que tu apprenne l'ASM et tu y arriveras tout seul.
Mais à la limite je pourrais faire pê un tutor sur ca: non seulement ca en aidera bcp mais en + ca remplira la nouvelle vers. de mon site (qui va bientot sortir) lol!
Hors ligne
à mon avis mieux vaut laisser le compilateur faire l'asm, tu feras pas mieux que lui pour ce genre de chose.
Hors ligne
Il faut avouer j'ai du mal à comprendre le code asm généré par TC...
Hors ligne
@ 2072 : pour les copies de tableaux à tableuax, tu px utiliser REP (en asm) ca ira bien + vite que tt ce que peut merder le compilateur !
Hors ligne
Oui mais un compilateur DOIT faire de l'asm avant de faire du binaire, l'asm est ensuite assemblé par un assembleur. En principe un compilateur connaît tous les recoins du langage asm, le code qu'il produit est très optimisé, il est souvent très difficile de faire mieux (cf les test graphics dans TOUCHE: fait les tests "Fill p/p wth C" et "Fill p/p wth ASM", tu verras que les temps sont indentiques). Donc ça m'étonnerait que TC n'utilise pas la command REP.
Mais pour le problème de Niff c'est ça double boucle qui fait perdre du temps:
for(i=0;i<=64;i++) for(j=0;j<=63;j++) scr[i][j]=scr2[i][j];
peut être remplacé en utilisant la fonction:
void *memcpy (void *dest, const void *src, size_t n);
Voilà ce que ça devient:
memcpy((void *)scr2, (void *)scr1, 63*64);
Je pence que ça ça devrait aller très vite.
@+
Hors ligne
En effet TC produit de l'asm mais de l'asm pas optimisé come on pourait le faire, en effet si tu fait Pltinum en C, je peut t'assurer que ce jeu seraui 3 ou 4 fois plus lent qu'en pur asm et pourtant c nous qu'avons fait le jeu, je soutiens que si tu fait une belle boucle en Asm , elle ira plus vite qu'une boucle en C, et m^me plus que memcpy
J'ai fait un prog en asm pour le port com qui serait tout simplement infaisable en C vu qu'il utilise les interruptione et l'acces direct a la mem, et si je l'avais fait, il serais 10 fois plus lent, voila !!
Hors ligne
Ça m'étonnerait beaucoup, memcpy a quand même était faite pour ça, elle doit être optimisée à fond. Et je n'ai pas dit que l'asm ne donnait pas de meilleur résultats dans certains cas. Mais pour copier un tableau faut quand même pas exagérer...
Et pour platinium je sais pas, la rapidité en programmation c'est surtout une question d'organisation et pas de choix de langage.
Et n'oubli pas que le C n'est qu'une "interprétation" du langage ASM, le compilateur fait ce que tu lui dit de faire, il ne va pas changer ton code pour l'optimiser, peut-être que lorsque tu programmes en ASM tu pense beaucoup plus à l'optimisation que lorsque tu programmes en C, d'où cette impression que l'asm est 4 fois plus rapide que le C.
L'asm pour nous est seulement intéressant pour les fonctions graphiques puisque TC ne connaît pas le V30 il ne connaît pas non plus les instructions qui agissent sur les bits.
Mais bon tout ça dépends du compilateur.
Hors ligne
ca devrait etre plus rapide qu'un memcpy (sinon aussi rapide), mais ne le mettez pas dans un fonction ca ralentirait...
(ben oui un appel de fonction c'est 1 instruction + 1 ou 2 instructions par parametre)
attention ne mettre qu'un "rep movs*"
asm{ mov ax,ds mov es,ax ;segment de destination = segment de source sur la Graph100 mov si,scr2 ;source mov di,scr ;destination mov cx,63*64 ;remplacer 63*64 par le bon nombre (compteur) cld ;copier dans la bonne direction rep movsb ;si c'est un tableau de char (1 octet/element) rep movsw ;si c'est un tableau de int (2 octets/element) }
Hors ligne
Vive Mastermage le grand sauveur !!
En effet 2072, desolé de te decdvoie mais c en efet bioen plus rapide en asm car en c c'est un suêrposition de routine preprogrammées et des fois ça prends de la place
Hors ligne
Merci Gandalf...