Je vais vous dévoiler quelques secrets sur les clignotements de sprite. De quoi devenir un vrai spécialiste! 
Vous savez probablement que nos consoles qui embarquent des fonctions hardwares d'affichage de sprite ont des limites...
#Retrogaming #NES
1/18

Vous savez probablement que nos consoles qui embarquent des fonctions hardwares d'affichage de sprite ont des limites...
#Retrogaming #NES
1/18
Il y a plusieurs contraintes sur l'affichage des sprites mais la principale qui défini la capacité de ces hardwares c'est le nombre de sprite affichable sur la même ligne (ou de pixel-sprite) qui sur une NES correspond à 8 sprites de 8 pixels (= 64 pixels-sprite).
2/18
2/18
Cette forte contrainte par ligne est liée simplement au balayage de l'image qui se fait ligne par ligne à une vitesse très élevée et ne laisse que peu de temps pour préparer la prochaine (60 microsecondes).
Sur cette scène qui semble simple on peut déjà dénombrer 12 sprites!
3/18
Sur cette scène qui semble simple on peut déjà dénombrer 12 sprites!
3/18
C'est donc 4 de trop!
Le hardware de la NES (ou de la Master System) ne pouvant en afficher que 8, il y en a donc 4 qui ne pourront pas l'être et vont disparaître.
On parle alors d'overflow de sprite par scanline
.
4/18
Le hardware de la NES (ou de la Master System) ne pouvant en afficher que 8, il y en a donc 4 qui ne pourront pas l'être et vont disparaître.
On parle alors d'overflow de sprite par scanline

4/18
C'est le programmeur qui choisit les sprites qui vont disparaître selon l'ordre dans lequel il va construire la liste de sprite qui définit les priorités de chacun.
Et son but va être d'alterner à chaque frame pour que ce ne soit pas toujours le même sprite qui disparaît.
5/18
Et son but va être d'alterner à chaque frame pour que ce ne soit pas toujours le même sprite qui disparaît.
5/18
C'est cette alternance choisie et provoquée volontairement par le programmeur qui va produire ce fameux clignotement de sprite (flickering) et nous permettre ainsi d'entrevoir tous les sprites malgré cette limite hardware.
6/18
6/18
Le clignotement n'est donc pas une conséquence directe de cette limite hardware. C'est quelque chose de provoqué et contrôlé par le programmeur.
Si on ne fait pas cela ça donne ce type de disparition prolongée et on ne veut pas qu'un sprite disparaisse totalement de l'écran.
7/18
Si on ne fait pas cela ça donne ce type de disparition prolongée et on ne veut pas qu'un sprite disparaisse totalement de l'écran.
7/18
Si j'ai pris le temps de vous expliquer tout ça c'est uniquement pour ce dont je vais parler maintenant qui est le véritable sujet du thread
En effet parfois les programmeurs provoquent volontairement un overflow de sprite pour s'en servir comme effet graphique.
8/18

En effet parfois les programmeurs provoquent volontairement un overflow de sprite pour s'en servir comme effet graphique.
8/18
Le meilleur exemple qui est aussi le premier usage de ce trick sur NES à ma connaissance c'est dans les donjons de #Zelda quand on franchit les portes.
9/18
9/18
En effet ce type d'effet d'occlusion de sprite par le décors est compliqué à gérer sur NES de par la façon dont celle ci traite les priorités d'affichages entre les sprites et le background (ce type d'occlusion est plus simple à gérer sur #MasterSystem).
10/18
10/18
Et l'une des solutions pour faire disparaître le sprite de façon progressive c'est de produire volontairement une saturation de sprite sur toutes ces lignes.
On peut effectivement voir ici un paquet de 8 sprites volontairement superposés dans la marge gauche de l'image.
11/18
On peut effectivement voir ici un paquet de 8 sprites volontairement superposés dans la marge gauche de l'image.
11/18
Ces sprites vides (et donc invisibles) créent un overflow sur toutes les lignes de l'image qui se trouve au-dessus de la porte et donc force la disparition du sprite de link (et de tous les autres) sur ces lignes de l'écran.
12/18
12/18
J'appelle ça le trick de l'overflow
.
Il existe d'autres méthodes pour faire de l'occlusion de sprite sur NES. Au moins 4 autres (par zone de transition utilisé ici pour les portes Est-Ouest, par priorité complexe, par bank switching, par découpage du sprite...).
13/18

Il existe d'autres méthodes pour faire de l'occlusion de sprite sur NES. Au moins 4 autres (par zone de transition utilisé ici pour les portes Est-Ouest, par priorité complexe, par bank switching, par découpage du sprite...).
13/18
Mais ce trick de l'overflow spécifiquement on peut le retrouver quand même dans d'autres jeux NES comme #Castlevania 2 pour faire disparaître le sprite de Simon quand il marche dans les marécages...
14/18
14/18
..ou dans Felix The Cat et quelques autres.
Ce trick à déjà été utilisé avant Zelda. Après beaucoup de recherches je l'ai retrouvé seulement dans 4 jeux plus anciens. 2 jeux SG-1000 (dont H.E.R.O.) et 2 jeux Coleco (dont River Raid).
15/18
Ce trick à déjà été utilisé avant Zelda. Après beaucoup de recherches je l'ai retrouvé seulement dans 4 jeux plus anciens. 2 jeux SG-1000 (dont H.E.R.O.) et 2 jeux Coleco (dont River Raid).
15/18
Ces machines en ont encore plus besoin que la NES car elles partagent le même chip graphique de Texas Instrument (avec aussi le MSX) qui n'a vraiment aucune fonction de priorité d'affichage entre sprite et background pour aider.
16/18
16/18
Si je parle de ce trick c'est aussi pour vous avertir de faire attention avec la fonction des émulateurs qui permet de s'affranchir des limites hardwares d'affichage de sprite (et donc du clignotement).
17/18
17/18
Car comme je viens de vous l'expliquer, cette limite hardware était donc aussi détournée par les programmeurs pour faire des effets visuels.
Si jamais vous activez cette option d'émulation sur Zelda ca risque de vous donner ce résultat
.
18/18
Si jamais vous activez cette option d'émulation sur Zelda ca risque de vous donner ce résultat

18/18
Sauf avec Mesen par exemple qui a une option pour adapter intelligemment (autant que possible) cette fonction selon la situation.
N'oubliez pas si un jour vous voulez retrouver facilement ce type de thread, aller sur mon compte secondaire d'archivage @UpsilandreA
N'oubliez pas si un jour vous voulez retrouver facilement ce type de thread, aller sur mon compte secondaire d'archivage @UpsilandreA
