18 mar
2010
2010
Algorithme de compression DAN0
PDF (english) 2010-03-19 : Compression Algorithms DAN0 by Daniel Bienvenu.pdfC file with pictures in Marcel's RLE format (see PDF) : samples_pictures.zip
DAN0 (Z80 asm routines to decompress DAN0 data) : dan0asm.zip
Bonjour,
Plusieurs algorithmes de compression existent. Certains sont déjà disponibles pour faire des projets de jeux ColecoVision, comme Run Length Encoding (RLE) dans la librairie Coleco de Marcel de Kogel que j'utilise régulièrement, Huffman Encoding dans les librairies de PkK, et bien d'autres dont ceux venants de la scène MSX et Commodore : BitBuster , PLetter, PuCrunch. Le plus connu et le plus efficace est sans doute PuCruch, mais il demande des ressources que la console ColecoVision ne peut offrir.
Il y a peu de temps, j'ai travaillé sur un nouvel algorithme de compression tout en ayant en tête de minimiser les ressources tout en offrant une bonne qualité de compression. Ce nouvel algorithme peut être vu comme une amélioration de Run Length Encoding (RLE). Mon objectif premier était de voir s'il était possible d'obtenir mieux malgré le peu de données que l'on peut entrer dans un projet ColecoVision, sans utiliser de mémoire vive, ni trop de temps processeur.
La compression RLE dans la librairie Coleco de Marcel de Kogel fonctionne bien, mais permet d'encoder "répétition d'une fois le prochain octet", ce qui est inutile compte tenu de la possibilité d'encoder "écrire le prochai octet". Parce que c'est un algorithm très simple, il offre donc une routine très petite et très rapide. Heureusement, nous avons l'habitude de dessiner des écrans titres professionnels qui comportent suffisamment de zones avec répétitions, par example de larges espaces vides, permettant l'achèvement d'une bonne compression avec RLE. Même si ce type de compression ne convient à tous les cas de données graphiques à compresser pour un projet ColecoVision, elle demeure utile.
Donc, J'ai pensé à un algorithme hybride permettant d'achever le même genre de compression que RLE tout en offrant une possible amélioration de compression, et ce, dans un temps raisonnable.
J'ai écrit une routine compacte en codes assembleur Z80 basé sur ma proposition du nouvel algorithme de compression que j'ai surnommé DAN0, ainsi qu'une documentation en version PDF que vous pouvez consulter ici.
Je n'ai pas encore fait de tests exhaustifs dans des situations réelles. Cependant, la routine de décompression fonctionne à merveille. Il ne manque que les outils de compression.
Le pire scénario suite aux tests sera de constater que l'algorithme n'offre guère plus qu'un simple RLE. Le meilleur scénario que pourrait être une amélioration de compression allant jusqu'à 20%.
Détails de la version pour project ColecoVision en langage C.
(cette version nécessite des instructions supplémentaires POP et PUSH pour la lecture des paramètres de la fonction avant de les utiliser.)
Espace ROM (cartouche de jeu) nécessaire : between 100 and 130 bytes.
Espace RAM (mémoire dans la console) nécessaire : 0 (si l'on exclut l'usage normal de la pile)
Registre(s) utilisé(s) : les paires AF, AF', DE, HL, BC.
Registre(s) sauvé(s) : Aucun.
Exemple :

ColecoVision Ms Space Fury (jeu) par Daniel Bienvenu, 2001, Taille 12 kilo-octets.
(Valeurs en octets incluant la taille de la routine de décompression)
RLE : 3436 (28.0%) <- taille et méthode de compression utilisées en 2001
DAN0 : 2825 (23.0%)
DAN0[alt] : 2749 (22.4%) <- nouvelle taille grâce à la nouvelle méthode de compression proposée.
Le nouvel algorithm a permis de sauver presque 1 kilo-octet à comparer à l'algorithm RLE. Super! :-)
0 commentaire(s)
aucune thématique
18/03/2010 à 15:38:53 Dernière modif. : 21/03/2010 à 02:48:33







