Des polygones dans un autre monde: l'Amiga 500

Cet article fait partie d'une série sur les ports du jeu Another World. Il parlera d'astuces lors de l'utilisation de l'Amiga 500 . Il est recommandé de lire d'abord l' article précédent .


L'histoire d'Amiga commence au milieu de 1982 avec un appel de Larry Kaplan à Jay Miner. Tous deux ont ensuite travaillé chez Atari dans les années 70. Tous deux ont décidé de quitter l'entreprise. Kaplan en raison d'un manque de reconnaissance et Miner en raison d'une interdiction de leadership sur l'utilisation du processeur Motorola 68000 cool mais cher.


En quittant Atari, Kaplan a fondé Activision. Après que les investisseurs lui aient demandé de développer une nouvelle plateforme de jeu, il a contacté les personnes les plus brillantes qu'il connaissait. Miner a repris le matériel du problème dans la nouvelle société Hi-Toro. Le système a reçu le nom de code "Lorraine".


Fin 1983, un prototype a été assemblé. L'appareil a impressionné les visiteurs du Consumer Electronics Show (CES) en janvier 1984, grâce à la démo de Boing Ball, dans laquelle d'énormes sprites se déplaçaient avec une fréquence d'images de 60 images par seconde. L'appareil a été annoncé en 1985 sous le nom "Amiga from Commodore", renommé plus tard Amiga 1000.




Remarque: Amiga 1000 n'a pas pu démarrer par lui-même, l'appareil n'avait pas de ROM. Le chargeur de démarrage était sur une disquette, et ce serait mieux si vous le stockiez comme la prunelle de vos yeux!


Série d'articles


  1. Polygones Another World .
  2. Polygones Another World: Amiga 500.
  3. Polygones Another World: Atari ST .

A500


En 1985, après une série d'erreurs, Commodore était dans une situation alarmante au bord de la faillite. Thomas Rattigan, alors COO, a opéré un changement radical. En plus d'un plan ambitieux qui couvre presque toutes les divisions de l'entreprise, il a divisé l'Amiga 1000 en deux produits: une nouvelle version haut de gamme conçue pour le marché créatif appelée Amiga 2000 et une version bon marché pour le Commodore 64 appelée Amiga 500.


L'Amiga 500, également connu sous le nom d'A500, a été lancé en 1987. Sous le capot du Motorola 68000, l'appareil fonctionnait à 7,16 MHz et avait 512 Ko de RAM. L'appareil a connu un énorme succès, il a gagné en popularité auprès des joueurs, des programmeurs, en particulier, des gens de la scène de démonstration. C'était le produit le plus vendu de Commodore (environ 6 millions d'unités ont été vendues de 1987 à 1991 [1] ).



L'A500 avait une ROM, mais il n'y avait que suffisamment de mémoire pour accueillir un chargeur de démarrage appelé Kickstart. Après avoir initialisé l'équipement, Kickstart invite l'utilisateur à insérer une disquette contenant soit un programme, soit Workbench OS. La disquette doit rester dans le lecteur pendant que la machine est sous tension. Les modèles ultérieurs, comme l'A1200 (alias la plus grande machine jamais fabriquée), avaient de l'espace pour un disque dur de 2,5 pouces et ont été libérés de l'utilisation de disquettes.


L'architecture


Depuis que la technologie a été créée à l'origine en vue du jeu [2] [3] , Amiga n'a pas été construit sur un processeur "de fer" avec la capacité audio et vidéo, comme la plupart des ordinateurs de l'époque. Le 68000 32/16 bits fonctionne avec le chipset, qui abrite trois puces puissantes: Paula (audio), Denise (vidéo) et Agnus (manipulation et synchronisation des données).



Une conception similaire avec un système de mémoire qui fournit non seulement un adressage plat, mais aussi la RAM commune disponible pour le processeur et le chipset, a grandement contribué à la popularité d'Amiga parmi les développeurs. À titre de comparaison, ni Sega Genesis ni Nintendo SNES, deux puissants systèmes sortis des années plus tard (respectivement en janvier 1989 et novembre 1990), n'avaient pas de mémoire commune.


Le bus chipset a un système de priorité complexe dans lequel 68 000 ne sont pas actifs sur des cycles pairs. Le chipset DMA (accès direct à la mémoire) essaie de n'utiliser que des cycles impairs pour multiplexer progressivement l'accès au bus sans affecter le processeur. Mais tout n'était pas toujours fluide. Agnus, en particulier, s'en est bien tiré là où 68 000 étaient affamés [4] .


Pour résoudre ce problème, les clients pouvaient acheter l'extension «Fast RAM» avec un «bus CPU» dédié pour 68000. Avec les instructions là-bas, 68000 [5], le CPU n'avait pas faim lorsque le canal DMA du blitter [15] était actif. Cela a doublé la vitesse d'exécution de 68 000.


Système vidéo


Le système vidéo est entièrement contrôlé par Denise, offrant un total de vingt modes graphiques [6] . La résolution la plus populaire était de 320x200 avec un rapport d'aspect de 1,6, ce qui ne correspondait pas aux moniteurs de l'époque (4/3 = 1,3). Le rapport hauteur / largeur entraîne une distorsion lorsque le tampon de trame est transmis au moniteur CRT.



Le tampon d'image n'est pas stocké en continu, mais dans des zones de mémoire distinctes appelées plans de bits. Jusqu'à cinq plans [7] bits de 8 Ko peuvent être alloués, ce qui donne 5 bits par pixel, ce qui vous permet d'obtenir 32 index de couleurs. À première vue, cette approche semble assez maladroite (en particulier pour un développeur ayant une expérience PC), mais Agnus et surtout son blitter dans son ensemble offrent plus de clarté.


La palette est basée sur un espace colorimétrique RVB 4 bits par canal. 12 bits par couleur vous permet d'identifier jusqu'à 4096 couleurs différentes, ce qui était beaucoup plus que d'habitude sur les ordinateurs de la même époque.


De nombreuses astuces nous ont permis d'afficher plus de couleurs. Comme le cuivre, vous permettant de changer la palette en HSYNC.


Les deux images suivantes représentent deux côtés opposés de l'espace colorimétrique RVB. Avec noir aux coordonnées (0x0, 0x0, 0x0), rouge à (0xF, 0x0, 0x0), vert à (0x0, 0xF, 0x0) bleu à (0x0, 0x0, 0xF) et blanc à (0xF, 0xF) 0xF) . Ces images colorées illustrent bien la liberté créative accordée aux développeurs graphiques.




Un autre monde sur Amiga


Un autre monde sur Amiga, en fait, n'est pas un port. Depuis que l'A500 a été utilisé pour le développement, il s'agit de la version originale créée entre 1989 et 1991 par Eric Shayy, 21 ans, qui travaillait seul dans sa chambre.



Deux raisons ont fait d'Amiga la machine de développement idéale. Tout d'abord, GenLock a permis la rotoscopie. Deuxièmement, et surtout, Amiga Agnus a grandement facilité le rendu des polygones.


Blitter


L'idée de créer un jeu basé uniquement sur des polygones est née de l'hypothèse erronée selon laquelle «Dragon's Lair, Escape from Singe's Castle» sur Amiga les utilisait [8] . Eric a dû en quelque sorte implémenter cela avec une fréquence d'images raisonnable. C'est à ce stade de la recherche et du développement qu'Amiga blitter a joué un rôle clé.


Dessin de polygone


La documentation de blitter mentionne une fonctionnalité appelée «Mode de remplissage de zone». Nous ne parlons pas de fantaisie de projection tridimensionnelle ou de texturation. Blitter fonctionne dans l'espace d'écran sur les chaînes de bits avec l'option de "remplir le blanc". Le travail est basé sur un balayage de gauche à droite. Tant que le blitter voit 0, rien ne se passe. Dès que le premier 1 est passé, le blitter remplira la ligne avec les unités jusqu'au 1. Le chiffre de la documentation illustre bien le travail. Notez que même un polygone concave peut être correctement affiché en utilisant cette méthode.


      tableau de bits avant tableau de bits après
   ______________________ ______________________
  |  |  |  |
  |  |  |  |
  |  |  |  |
  |  1 1 1 1 |  |  11111 11111 |
  |  1 1 1 1 |  |  1111 1111 |
  |  1 1 1 1 |  |  111 111 |
  |  11 11 |  |  11 11 |
  |  1 1 1 1 |  |  111 111 |
  |  1 1 1 1 |  |  1111 1111 |
  |  1 1 1 1 |  |  11111 11111 |
  |  |  |  |
  |  |  |  |
  | ______________________ |  | ______________________ |

    

Une telle solution conduit au deuxième problème - comment dessiner les "frontières" du polygone. Si vous regardez attentivement la figure ci-dessus, vous verrez qu'il s'agit d'un algorithme de Bresenham non standard [9] , car les lignes horizontales doivent être sautées. Heureusement, le concepteur Amigi a présenté le mode de tracé de ligne à blitter [10] .


Nous n'avons pas encore fini. Il y a encore des problèmes. Tout d'abord, «tracer des lignes puis remplir la zone» doit être effectué quatre fois (une fois pour chaque plan de bits), ce qui semble très coûteux. Deuxièmement, le moteur doit rendre des centaines de polygones. Blitter a besoin d'un tampon propre plein de zéros et de bonnes limites d'unité pour fonctionner. Après plusieurs polygones, le tampon de trame ressemblera probablement à une soupe de bits. Enfin, le blitter ne produit que 1-ts, mais nous devons avoir la capacité de sortir 0 dans certains des plans à quatre bits afin de générer la couleur correcte à 4 bits.


La solution à ces problèmes est de configurer les entrées des blitters A, B et C [11] . Ce processus est mieux expliqué par Blogger Scali dans son blog [12] .


... il y a une solution à ce problème, et ce n'est même pas si difficile. Blitter peut être rendu n'importe où dans chipmem, il est donc facile de définir un tampon de nettoyage temporaire, un "bloc-notes", et d'y dessiner un polygone. Ensuite, vous le copiez dans la zone réelle de l'écran en utilisant un peu de lumière sur le masque [16] . Souvent, cette opération est également appelée découpe de cookie. Il s'agit essentiellement de la même opération que vous utiliseriez avec des images 2D lorsque vous enregistrez des pixels uniquement lorsqu'ils sont définis dans l'image d'origine et laissez les pixels cibles intacts dans le cas contraire (opération OU logique). Cela combinera correctement les polygones à l'écran.


En fait, c'est peut-être maintenant le moment d'expliquer le blitter plus en détail. Blitter a 3 entrées et 1 sortie. Tous sont traités par DMA, il peut donc fonctionner complètement indépendamment du CPU après le réglage. 3 entrées peuvent être combinées à l'aide d'opérations logiques. Le résultat est ensuite écrit sur le canal de sortie. Dans le cas d'un masque blit, vous effectuez généralement l'opération suivante:


= ( ) ( )


- OpenBlog de Scali



Sur la base des données d'entrée du blitter, nous avons maintenant une image complète de ce qui est nécessaire pour le rendu de chaque polygone.


  1. Sélectionnez un morceau de tampon.
  2. Zero clean avec un blitter.
  3. Dessinez les bordures du polygone avec des unités en mode ligne de dessin.
  4. Remplissez la zone tampon avec des unités en mode "remplissage de zone".
  5. Blitz un morceau de tampon quatre fois (une fois pour chaque plan de bits).

Ce n'était pas tellement amusant, mais le travail était fait. L'effort en valait la peine, car le programme pouvait traiter jusqu'à 50 polygones (selon leur taille) à une vitesse de 20 images par seconde. Ce qui nous amène au deuxième problème.


Copier le tampon de trame


Quelle que soit la vitesse à laquelle le blitter pouvait dessiner les polygones, il n'était pas encore assez rapide. Chaque image se compose de milliers de polygones. Certains polygones sont si petits (1x1, appelés pixigons) qu'ils ne justifient pas les frais généraux. L'un des premiers décors du jeu (lorsque Leicester quitte l'eau) se compose de 981 polygones.



La solution consistait à mettre en cache l'arrière-plan dans un tampon BKGD spécial avec une simple copie. C'était une tâche spéciale pour blitter.


Blitter est l'un des deux coprocesseurs d'Amiga. Dans le cadre de la puce Agnus, il est utilisé pour copier des blocs de mémoire rectangulaires et tracer des lignes. Lors de la copie de mémoire, elle est environ deux fois plus rapide que 68000 et peut déplacer près de quatre mégaoctets par seconde. Il peut tracer des lignes à une vitesse de près d'un million de pixels par seconde.


- Amiga Developer CD v2.1 (OS 3.5)



À une vitesse de 4000 octets en millisecondes, le blitting d'un tampon BKGD au début de chaque nouvelle trame ne nécessite "que" 8 ms.


Remarque: malgré le fait que Another World était un jeu poli, certains bords sont restés "rugueux". Si un joueur essaie d'être intelligent pendant le quiz sur la protection contre la copie [13] et appuyez sur «c» pour entrer le code pour accéder au processus de jeu, l'écran devient vert et Amiga se fige. La seule issue est de redémarrer le jeu.


Remplissage de Framebuffer


Bien que le processeur 68000 puisse enregistrer 16 bits à la fois, le framebuffer a également été probablement nettoyé à l'aide d'un blitter. La documentation d'Amiga contient un exemple de code «clearmem» [14] qui utilise un blitter pour nettoyer 128 Ko de RAM.


Les références


  1. Wikipédia: Amiga 500 .
  2. Commodore: les années Amiga .
  3. Commodore: les dernières années .
  4. Amiga Chip RAM .
  5. Wikipedia: Amiga Hardware .
  6. Modes d'écran Amiga .
  7. Graphiques 3D Amiga en temps réel .
  8. Classic Game Postmortem - Un autre monde .
  9. Algorithme de Bresenham .
  10. 6 Mode Blitter Hardware / Zone Fill .
  11. 6 Blitter Hardware / canal DMA .
  12. Garder les choses réelles, partie 3 .
  13. Roue codée .
  14. Documentation Amiga, «Exemple: Clearmem» .
  15. Blitter .
  16. Bit blit .

Source: https://habr.com/ru/post/fr483140/


All Articles