Erf, j'ai bien fait de poster alors, j'avais des doutes, également sur VTI, maintenant j'en suis sur..
Sinon, bge marche très bien, dbf ne travaillant que sur un word.
Mais juste avant de me lancer dans le codage de ma routine en asm, est-cequ'il n'y aurait pas déjà des optimisations a faire niveau algorithme ?
Ce qui me vient à l'esprit:
Tu peux réduire le nombre des arguments passés à la fonction en définissant un format pour tes données.
Tu peux éviter les multiplications avec "mulu" utilisant les décalages de bits (lsr / lsl).
Tu peux travailler le moins possible avec des coordonées cartésiennes, utilise plutôt une adresse et un registre (c'est pas évident à gérer, mais c'est plus rapide).
Sinon, il y a le précalculé, i.e. tu mets en RAM le sprite décalé 1,2,3,4,5,6, et 7 fois, et après ca va tout seul...
Lorsque tu cherches l'adresse et le bit correspondant à un pixel sur l'écran à partir de ses coordonnées cartésiennes, fait attention au cas où les coordonnées sont négatives.
Sinon, si tu vas afficher à une adresse paire (i.e. bit de poids faible à 0) et s'il te reste encore assez de largeur du sprite à dessiner tu peux travailler sur des mots, voire peut-être même avec des mots-longs (attention que les données du sprite soient également à une adresse paire), à mon avis, si tu arrives à implémenter ne serait-ce qu'une optimisation en "word", la différencce de vitesse sera significative. (je l'ai fait pour une routine de ligne horizontale, pour une routine de remplissage de rectangle, et pour une routine de remplissage de triangle, il n'y a pas photo, c'est bien plus rapide, alors je pense que pour une routine d'affichage de sprites il en sera de même.)
Sinon, je pense qu'en utilisant un écran (240xh) virtuel (tiens, un petit frame pointer ;-)), sur lequel tu copies ton sprite rapidement (move)
soit en (x-mod(x,8);y), puis tu décales toute la partie entre y_clip_min et y_clip_max vers la droite avec une belle boucle de roxr.w (a0)+
soit en (x-mod(x,8)+8;y), puis tu décales toute la partie entre y_clip_min et y_clip_max vers la gauche avec une belle boucle de roxl.w -(a0)
Selon ce qui est le plus rapide.
Il ne reste plus qu'à appliquer alors la partie qui t'intéresse de l'écran virtuel sur l'écran, avec la bonne opération logique et des masks pour le clipping à droite et à gauche.
Pour ce qui est du mask du sprite, je n'en ai jamais utilisé, mais tu devrais pouvoir le gérer avec cette méthode.
Je pense qu'elle donnera quelque chose de plus rapide que de décaler chaque octet du sprite un à un...
Enfin, c'est une idée comme cela, je m'y pencherai plus dessus les vacances prochaines...
Bon courage !