ton *(dest_long+1) il est ecrase au tour d'apres par *(dest_long). C'est comme si cette ligne ne servait pas (sauf pour la derniere serie de pixels)
Pour pouvoir lire ou ecrire dans la memoire en utilisant des mots de 32 bits il faut que l'adresse de ce mot soit alignée sur 32bits.
Si on parle de coordonées de pixels 16bits ca revient a dire que la coordonée X doit etre paire..
Enfin... On entre dans l'epineux probleme des lectures/ecritures non alignées...
Sinon, pour répondre a ta question, le moyen le plus efficace d'afficher un tile (sprite carré sans transparence) est d'utiliser l'asm, et les instructions ldmia et stmia que le compilo semble ne pas connaitre.
Ces instructions permettent de charges n registres avec des adresses consecutives en memoire ou d'ecrire ces n registres a des adresses elles aussi consecutives.
En gros
*src++ = *dst++;
*src++ = *dst++;
*src++ = *dst++;
*src++ = *dst++;
*src++ = *dst++;
*src++ = *dst++;
*src++ = *dst++;
*src++ = *dst++;
est remplacé en asm par :
ldmia r0!,{r4-r11}
stmeqia r1!,{r4-r11}
(r0 = src, r1 = dst)
Tu peux t'arranger pour que ton tile soit stocké a une adresse alignée sur 32bits, et comme ses dimensions sont des puissances de 2 tu ne rencontrera aucun pb d'alignement pour la lecture, par contre pour l'ecriture il faut gerer deux cas : ecriture alignée, et ecriture decalée d'un pixel (pixels impairs).
Pour gerer ce cas la, la solution la plus efficace semble etre de garder les ldmia stmia et de faire la rotation des pixels dans tous les registres entre le chargement et l'ecriture...
Oui je sais c'est plus facile a dire qu'a faire...
StephC_int13 Le 12/08/2004 à 16:36Edité par StephC_int13 le 12/08/2004 à 16:52 Il faut vraiment faire attention quand on deroule des boucles, l'effet contraire a celui souhaité peut vite se produire.
Si on deroule vraiment trop la boucle il faudra plus de temps pour la charger dans le cache et le bench va indiquer des perfs plus mauvaises qu'une boucle moins deroulée.
MAIS, meme si la boucle deroulée est benchée plus rapide il ne faut pas oublier l'impact global sur le reste du soft, si le cache doit etre entierement vidé pour charger cette routine le bench sera peut etre bon mais le reste du soft devra se recharger dans le cache pour s'executer...
C'est evidement tres difficile a mesurer....
La prudence dicte de ne derouler les boucles que lordsque c'est vraiment important et de ne pas derouler des monstres....
Tu connais peut etre le truc du "Duffs device" ?
Tres pratique pour derouler des petits bouts de code, l'ideal etant d'en faire une macro, et de pouvoir l'activer ou la desactiver par un simple switch de compilation.
Facile ensuite de mesurer les perfs avec et sans.
t'as inverse mask1 et mask2 dans ta boucle
Il n'y a pas d'alignement automatique ??? Hum, ça doit venir de là alors. Je vais essayer de voir un peu l'adresse de mon tile.
J'étais persuadé que chaque nouvelle zone déclarée était alignée correctement.
Concernant ma routine, je ne donne jamais d'adresse impaire en paramètre : tous les tiles ont une adresse multiple de 8 (ou 16 en fct de la taille du tile).
null Le 22/08/2004 à 11:30 Je ne suis toujours pas arrivé à faire une routine de sprite 32*32 avec des longs, alors si l'un d'entre vous a une routine qui marche , est-ce que vous pourriez la poster dans ce topic ?
www.wikio.fr/user1921&info=comments