1 points par GN⁺ 2024-02-26 | 1 commentaires | Partager sur WhatsApp
  • Magicore Anomala exploite les capacités graphiques et sonores de l’Amiga, sorti en 1985, pour réaliser des CG plein écran et des transitions façon animation, mais dans le moteur du jeu il faut résoudre simultanément la disposition de la RAM, le découpage de l’écran et les contraintes des sprites
  • Sur une configuration Amiga 500 typique, la Chip RAM utilisable pour le graphisme et le son n’est que de 512 Ko ; la taille non compressée de 48 Ko d’un CG 320x240 en 32 couleurs devient donc un coût important
  • Les CG sont réduits à environ 8 Ko avec la compression ZX0, stockés en RAM d’extension, puis décompressés en Chip RAM juste avant l’affichage en réutilisant les 48 000 octets de mémoire écran existante
  • L’effet de transition est créé par le copper, qui modifie des registres matériels à certaines lignes de balayage et désactive/réactive le DMA des bitplanes ; le CPU ajuste à chaque frame les valeurs de la copperlist selon la largeur du split
  • Les motion lines de l’arrière-plan doivent contourner les dépendances des sprites Amiga aux couleurs, à la réutilisation et aux bitplanes ; les attached sprites, des bits de contrôle factices, le maintien d’un seul bitplane et l’ajustement de BPLMOD1 en sont les mécanismes clés

Le problème de RAM pour intégrer des CG plein écran sur Amiga 500

  • La plateforme cible de Magicore Anomala est l’Amiga 500 standard, avec 512 Ko de Chip RAM et 512 Ko de RAM d’extension
    • La seule mémoire que le chipset Amiga peut utiliser pour la sortie graphique et sonore est la Chip RAM
    • La RAM d’extension n’est accessible qu’au CPU, ce qui la rend difficile à utiliser directement pour le graphisme et le son
  • Les character graphics (CG) plein écran sont des images bitmap 320x240 en 32 couleurs, qui occupent 48 Ko sans compression
    • Si l’on tient compte des assets communs, des données de niveaux et de l’allocation de la mémoire écran, 48 Ko représentent un overhead important
  • Le support de compression des assets ajouté récemment utilise le format de compression ZX0
    • Le CG compressé est réduit à environ 8 Ko
    • Lors du chargement des assets du niveau, le CG compressé est placé en RAM d’extension
    • Il est décompressé en Chip RAM juste avant l’affichage

Une méthode qui évite de réserver 48 Ko supplémentaires de Chip RAM

  • Au lieu de chercher un bloc libre séparé de 48 Ko en Chip RAM pour le CG, une partie de la mémoire écran existante est réutilisée
    • L’image de fond de la pièce
    • La couche écran destinée au rendu des objets dangereux
    • La zone d’écran de la boîte de texte
  • Ces trois zones mémoire sont contiguës en RAM et leur taille cumulée est de 48 000 octets, ce qui correspond exactement à la taille du CG
  • L’image de fond de la pièce peut être restaurée après l’affichage du CG, donc l’écraser ne pose pas de problème
  • La décompression du CG prend environ 500 ms, mais elle est intégrée au déroulement de la cutscene pour ne pas donner l’impression d’un chargement
  • Une vidéo proof-of-concept du gameplay de Magicore Anomala est disponible sur YouTube

Effet de découpage de l’écran et utilisation du copper

  • Au départ, une transition en wipe vertical avait été envisagée, mais pour obtenir un rendu agréable il aurait fallu un dégradé ajustant la palette de couleurs à chaque ligne de balayage
    • Il a été jugé difficile de régler les 32 couleurs dans un seul blanking horizontal avec le seul copper
    • Pour éviter d’avoir à faire du « racing the beam », un effet de découpage de l’écran a été choisi
  • L’effet de découpage paraît plus spectaculaire au public général, et le copper de l’Amiga se comporte presque comme s’il avait été conçu pour ce type d’effet
    • Un effet similaire intégré à Amiga Workbench est visible dans cette vidéo
  • L’implémentation combine deux fonctionnalités de l’Amiga
    • Le copper exécute sa propre liste d’instructions en parallèle du CPU et peut modifier des registres matériels à des lignes d’écran précises
    • Le pointeur d’écran est défini via des registres matériels, ce qui permet de déplacer la mémoire écran vers n’importe quel emplacement de la Chip RAM

Arrêter puis reprendre le dessin du DMA des bitplanes

  • Par exemple, si la mémoire écran principale commence à 0x20000, le copper configure généralement cette adresse dans les registres DMA des bitplanes
    • Quand les bitplanes sont activés, le DMA lit séquentiellement cette zone mémoire et l’affiche à l’écran
  • Si chaque ligne horizontale occupe 0x100 octets et que le pointeur d’écran est réglé sur 0x20800, l’écran semble avoir défilé de 8 lignes vers le haut
    • C’est parce que le point de départ de l’écran a été déplacé de 8 lignes plus bas en mémoire
  • La moitié supérieure du split est défilée vers le haut avec cette méthode
  • Au point de split, le copper désactive le DMA des bitplanes et change la couleur de fond en rouge
    • Les registres matériels liés aux bitplanes sont alors, en pratique, figés
    • Lorsqu’il atteint la partie inférieure du split, il restaure la couleur de fond et réactive le DMA des bitplanes
    • L’écran reprend son dessin depuis l’endroit où il s’était arrêté, mais sa position d’affichage réelle est plus basse
  • À chaque frame, le CPU ajuste vs_TCopTop et vs_TCopBottom selon la largeur actuelle du split
    • L’ajustement du pointeur d’écran pour le split supérieur se fait aussi à ce moment-là, mais il n’est pas inclus dans l’exemple de code

Contournements pour les sprites des motion lines « woosh »

  • Les motion lines de l’arrière-plan animé sont dessinées avec des sprites
    • Les sprites sont dessinés indépendamment de la mémoire écran et peuvent être déplacés, ce qui les rend adaptés à cet usage
    • Les sprites Amiga ont toutefois beaucoup de limitations et sont complexes à manipuler
  • Contraintes de couleur

    • Les sprites partagent la palette de couleurs avec les bitplanes, il faut donc utiliser le moins de couleurs possible
    • Les motion lines n’utilisent que 3 couleurs, laissant 28 couleurs au CG et 1 couleur à l’arrière-plan
    • Sur Amiga, la plage de couleurs de palette utilisée varie selon la paire de sprites
      • Les deux premiers sprites utilisent les couleurs 16-19
      • Les deux sprites suivants utilisent les couleurs 20-23
    • Si deux sprites sont attachés, ils se comportent comme un seul sprite avec une palette de 16 couleurs et peuvent utiliser les couleurs 16-31
    • Les motion lines utilisent 4 attached sprites et, dans les graphismes, seulement les couleurs 29-31
  • Utiliser le même graphisme de sprite à plusieurs positions

    • Les 4 premiers octets du graphisme d’un sprite sont des bits de contrôle qui définissent sa position et sa hauteur
    • Cette structure pose problème si l’on veut dessiner le même graphisme à plusieurs positions
    • Une tentative a été faite pour définir directement les bits de contrôle des sprites via les registres matériels, mais il n’a pas été possible de les faire apparaître à l’écran
    • Le DMA des sprites Amiga, comme le DMA des bitplanes, suit les pointeurs de données des sprites et dessine à l’écran
    • La solution consiste à créer 8 faux sprites de 4 octets
      • Ces faux sprites ne contiennent que les bits de contrôle
      • Tous les pointeurs de sprites sont d’abord réglés sur les faux sprites
      • Vers la ligne 19, le DMA des sprites lit les pointeurs et charge les bits de contrôle
      • Ensuite, tous les pointeurs sont remplacés par le véritable graphisme de « motion line »
    • Au final, le DMA utilise le même graphisme tout en étant chargé pour dessiner les sprites à des positions différentes, et cette bascule est gérée dans la copperlist

Le problème des sprites qui disparaissent quand les bitplanes sont désactivés

  • Avant que le CG n’atteigne le haut de l’écran, il existe un espace vide entre le haut de l’écran et le point de départ du CG
    • Si les bitplanes restent activés à ce moment-là, des données parasites sont dessinées à l’écran
  • Dans cette zone, il faut désactiver les bitplanes afin que le DMA ne lise pas ces données parasites
  • Le problème est que lorsque les bitplanes sont désactivés, les sprites ne sont plus dessinés non plus
    • Les motion lines ne deviennent alors visibles qu’à l’intérieur des limites du CG
  • La solution consiste à ne pas désactiver complètement les bitplanes, mais à n’en garder qu’un seul activé tout en réglant le pointeur d’écran sur des données vides
    • Quelque chose est bien dessiné à l’écran, mais le résultat est invisible
  • Il n’est pas nécessaire de préparer tout un écran vide
    • À raison d’un pixel sur 1 bit, une ligne de 320 pixels représente 320 bits, soit 40 octets
    • En réglant BPLMOD1 sur -40, le pointeur revient 40 octets en arrière après chaque ligne, ce qui répète les mêmes 40 octets
    • Il suffit donc de laisser vides les 40 premiers octets situés dans la safety margin de l’écran

Résultat et derniers détails à régler

  • Au départ, en raison des besoins en RAM, il n’était pas certain qu’il soit possible d’intégrer ce type de CG au jeu, mais après l’implémentation de la compression des données, l’overhead s’est révélé très raisonnable
  • Il devient possible d’ajouter à Magicore des ornements visuels supplémentaires
  • Quelques petits problèmes restent à traiter
    • Par exemple, éviter que le bas d’une motion line de 100 px disparaisse brutalement après être sorti par le haut de l’écran
  • Cet effet n’utilise pas du tout le blitter
  • Comme il impressionnait les gens à la fin des années 1980, l’Amiga reste aujourd’hui une plateforme capable d’impressionner par ses capacités d’affichage graphique en couleur

1 commentaires

 
GN⁺ 2024-02-26
Commentaires sur Hacker News
  • Je comprends exactement ce que signifie « Racing the beam ». À l’époque, on changeait la couleur du faisceau différemment au début et à la fin d’une routine synchronisée sur le vsync, afin de calculer combien de temps CPU, en nombre de lignes de balayage, on pouvait utiliser par frame
    Je me souviens que l’adresse utilisée pour ça était $dff180. C’était la couleur 0 de la palette, donc elle restait toujours visible sur les bords de l’écran, en dehors de la zone bitmap
    On apprenait aussi ce genre d’astuces entièrement par bouche-à-oreille, sans Internet, et je ne savais pas qu’il y avait encore aujourd’hui des gens qui essayaient de tirer davantage de ce chipset

  • Je me demande vraiment quel genre de personnes trouve le temps de faire des jeux sur Amiga. Les jeunes ne doivent pas s’intéresser à ce genre de vieilles machines, et ceux qui ont grandi avec doivent être pris par leur famille et leur travail
    Même sans être débordé, il y a tellement de projets tout aussi amusants et plus actuels. Mais c’est vraiment génial

    • Je suis né en 1991 et, avant de passer à un PC Windows 95, on avait un Amiga 1000 à la maison. J’ai donc toujours eu une certaine nostalgie de l’Amiga, et mon attachement a grandi à mesure que je comprenais mieux les puces uniques et puissantes qui faisaient ses performances
      Aujourd’hui, je travaille à plein temps comme développeur de jeux indé. Faire un jeu Amiga était presque un rêve de toujours, et j’estime maintenant avoir les compétences pour y arriver
      Je veux montrer qu’en exploitant les outils d’aujourd’hui et les connaissances largement diffusées, on peut redonner vie à ce matériel classique adoré avec une expérience de jeu fondée sur des principes de conception modernes
    • Pour beaucoup de gens, rien n’est aussi amusant que l’Amiga, le C64, l’Atari ou le ZX Spectrum
      Si l’on relie tout dans sa vie à sa carrière, toute la vie devient du travail
      C’est un peu comme demander pourquoi s’entraîner à la peinture à l’huile alors qu’il y a Photoshop, ou pourquoi restaurer une voiture ancienne alors qu’il y a Tesla
    • Je ne suis peut-être pas assez jeune pour faire partie de ce groupe, mais j’aime beaucoup des ordinateurs qui datent d’un peu avant mon époque. J’ai récupéré un Commodore 64, remplacé les condensateurs, changé le PLA, et ajouté deux SID ainsi qu’un mod de « changement de région »
      Le mod de changement de région est assez complexe, car il faut basculer entre deux VIC-II et deux oscillateurs. J’ai aussi un MSX2 ; je ne l’ai pas beaucoup utilisé, mais il a beaucoup de charme
      Trouver du temps pour coder réellement sur ces machines est difficile, mais comme pour la plupart des loisirs de salariés, c’est une question d’y consacrer ses soirées et ses week-ends quand l’inspiration arrive
      Le rétrocomputing est un loisir fascinant et gratifiant. Ce qui me frustre, toutefois, c’est davantage le prix et la difficulté à trouver des pièces que le manque de temps
      C’est dommage, car on dirait qu’il y a de plus en plus de gens qui essaient de vendre très cher tout ce qui porte l’étiquette « antique » ou « vintage » sur le marché informatique
      Pour les plus âgés, je ne peux pas vraiment parler à leur place, mais certains de ceux qui produisent encore des démos Commodore 64 semblent surtout vouloir renouer avec leur enfance
      Certaines œuvres racontent presque explicitement cette histoire, comme la démo assez récente « Mojo » de Bonzai et Pretzel Logic. Tenter une narration « sérieuse » dans une production demoscene a un côté un peu gênant, mais c’est quand même attachant
      C’est un loisir qui prend beaucoup de temps, mais si l’on veut vraiment en trouver, on finit par y arriver
      [1] : https://csdb.dk/release/?id=232966, https://www.youtube.com/watch?v=HXi3oJ9huiI
    • J’ai un ami qui fabrique des interfaces pour brancher des manettes modernes sur de vieux ordinateurs. Ici, il connecte une Nintendo Balance Board pour jouer à Decathlon sur Commodore 64
      [1] https://retro.moe/2024/02/04/bluepad32-v4-0/
      [2] https://www.youtube.com/watch?v=Nj5fZlt_834
    • J’ai 5 ans de plus que l’auteur du billet. Au début de la pandémie, j’ai rassemblé un Atari, un Amiga et quelques ressources pour apprendre l’assembleur par plaisir. Il y a même un cours Udemy
      https://www.udemy.com/course/programming-games-for-the-atari...
      Je pensais que le télétravail me donnerait plus de temps libre, mais en réalité non. Il faudra quand même que je m’y remette un jour
  • Je me suis toujours demandé à quoi auraient ressemblé des jeux de style console japonaise sur Amiga, et si l’Amiga manquait vraiment de puissance ou si c’était simplement le design de la plupart des jeux qui n’était pas à mon goût
    Bonk a été excellemment porté par Factor 5, mais eux étaient presque des magiciens

  • Le passage disant qu’un « Amiga 500 ordinaire dispose de 512 Ko de Chip RAM et de 512 Ko de RAM d’extension » est légèrement inexact. Le A500 de base n’avait que 512 Ko de Chip RAM
    Beaucoup d’utilisateurs ajoutaient l’extension RAM A501, qui ajoutait 512 Ko de Fast RAM auxquels le matériel graphique ne pouvait pas accéder directement
    Elle était indiquée comme Fast RAM, mais en raison de l’architecture de l’extension, elle était plus lente que de la vraie Fast RAM

    • C’est ce qu’on appelle la Slow RAM
      La plupart des possesseurs d’A500 avaient l’extension trapdoor de 512 Ko. Beaucoup de logiciels, y compris des jeux comme Monkey Island, ne se lançaient pas sans 1 Mo de RAM au total
      Aujourd’hui, on trouve largement des extensions trapdoor bon marché issues de conceptions matérielles ouvertes, qui offrent 1,5 Mo de Slow RAM, 512 Ko de Chip RAM pour atteindre 1 Mo au total, ainsi qu’une RTC
  • Il y a quelque chose d’incroyablement attirant dans le fait de coder avec de telles contraintes

    • « L’ennemi de l’art, c’est l’absence de contraintes »
  • Content de voir IE. Ça fait plaisir de le voir explorer l’Amiga

  • J’ai l’impression que beaucoup de gens ont joué avec un Amiga différent de celui que j’ai connu. Il y avait clairement des jeux impressionnants visuellement, mais c’était aussi le cas sur Nintendo NES, et je ne regarde ni l’un ni l’autre avec autant de tendresse
    Cela dit, montrer comment ce genre d’animation a été réalisé est vraiment très chouette

    • J’ai eu les deux, et honnêtement l’Amiga donnait l’impression d’être une machine avec deux générations d’avance. Quand on regarde les différences matérielles, ce n’est pas étonnant
      L’Amiga était vraiment un système qui avait tout. Un CPU 32 bits haut de gamme, une accélération graphique, un excellent audio, et littéralement 256 fois plus de RAM que la NES
      Même la SNES ne s’en approchait pas, et il a fallu attendre l’époque de la Sega Saturn pour que je voie une machine dépasser l’Amiga
    • Juste pour vérifier : tu sais que c’est un nouveau jeu actuellement en développement ?
      https://www.youtube.com/watch?v=4SB20aFHc08