- doom-htop est un projet expérimental qui utilise la liste des processus de
htop comme sortie graphique pour afficher un écran de jeu de type Doom en ASCII
- L’exécution nécessite un fichier de données de jeu WAD ; le dépôt inclut freedoom1.wad, tandis que le
DOOM1.wad shareware classique doit être téléchargé séparément
- Le fonctionnement consiste à faire créer par le processus Doom autant de processus enfants qu’il y a de lignes à l’écran, chaque processus écrivant dans son propre argv[0] une ligne reçue via mémoire partagée afin de composer une image dans la zone des noms de processus de
htop
htop doit être configuré pour rafraîchir les noms de processus à chaque mise à jour ; avec -d 1, l’objectif est un rafraîchissement d’environ 10 FPS, et -s M_VIRT sert à trier selon la mémoire virtuelle
- L’entrée clavier repose sur une approche simple de type keylogger qui ouvre le périphérique clavier, ce qui peut nécessiter
sudo ; seul Ubuntu 22.04 a été testé, et WSL comme Arch demandent d’ajuster le chemin du périphérique
Objectif du projet et forme d’exécution
- doom-htop est un projet créé pour vérifier si
htop peut servir à rendre les graphismes d’un jeu vidéo classique
- Le résultat prend la forme d’un affichage de Doom comme une vidéo ASCII au-dessus de la liste des processus de
htop
- Le projet est un fork de ozkl/doomgeneric, qui prend en charge la majeure partie du travail lourd lié à l’exécution de Doom
Compilation et données de jeu nécessaires
- La compilation s’effectue dans le répertoire
doomgeneric avec make -j8
cd doomgeneric
make -j8
- Pour l’exécuter, il faut un fichier de données de jeu WAD
- Le dépôt inclut
freedoom1.wad, avec les crédits au projet Freedoom
- La version shareware gratuite classique
DOOM1.wad peut être téléchargée depuis Doom Wiki
DOOM1.wad n’a pas été inclus car l’auteur n’est pas certain qu’il soit légalement acceptable de le publier sur GitHub
Méthode d’exécution et configuration de htop
- Il est recommandé de sauvegarder tout travail important avant l’exécution ; l’environnement de test était un Lenovo ThinkPad T430s vieux de 12 ans, avec 8 Go de RAM, un Intel Core i7-3520M @ 2.90GHz et Ubuntu 22.04, où cela a fonctionné correctement
- La commande d’exécution par défaut est la suivante
sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
sudo ./doom-htop -iwad freedoom1.wad
htop -d 1 -s M_VIRT
- Peu importe que
doom-htop ou htop soit lancé en premier
sudo n’est requis que pour ouvrir le périphérique clavier
- Sans
sudo, il est difficile de saisir des commandes, mais l’affichage reste visible
htop -d 1 vise un rafraîchissement de 10 FPS
htop -s M_VIRT trie les processus selon leur allocation de mémoire virtuelle afin de regrouper visuellement les processus concernés
- Si le tri ne s’aligne pas correctement, il est possible d’ajuster la valeur
PROCS_MALLOC_SIZE dans main.c
- La commande
sed est nécessaire parce que htop ne met pas à jour les noms de processus à chaque rafraîchissement par défaut
Fonctionnement interne
- Le dépôt ajoute principalement trois fichiers au
doomgeneric existant
main.c
keylogger.c
ascii_stuff.c
ascii_stuff.c contient de longues instructions if générées par un simple convertisseur image-vers-ASCII
- Le processus principal de Doom crée via
fork autant de processus qu’il y a de lignes dans l’image convertie en ASCII
- Le processus principal crée un segment de mémoire partagée avec chaque processus enfant, puis copie chaque ligne de l’image dans le segment mémoire du processus correspondant
- Chaque processus enfant recopie ensuite le contenu de son segment et écrase
argv[0]
htop actualise alors la valeur de argv[0], affichée comme nom du processus, et montre ainsi l’image ligne par ligne
Idée de tri et gestion des entrées
- L’idée initiale était de trier selon l’utilisation CPU, en créant des processus consommant un pourcentage CPU précis, mais cela s’est révélé difficile à implémenter
- La valeur
nice de Linux a aussi été envisagée, mais comme seuls 19 niveaux sont accessibles à un utilisateur normal, cela a été jugé insuffisant pour obtenir de meilleurs graphismes
- Finalement, c’est l’allocation de mémoire virtuelle qui a été retenue, car elle semblait permettre un réglage assez fin par processus
- Même si tous les processus issus de
fork allouent la même quantité de mémoire, htop affiche les images dans le bon ordre sur le système de test
- L’auteur suppose qu’en cas d’égalité, le tri se fait peut-être selon l’heure de création
- Mais, sans certitude sur le comportement d’autres systèmes, il ne s’appuie pas sur des valeurs identiques
- Les entrées clavier sont gérées par un simple keylogger ouvrant le périphérique clavier
- Grâce à cette méthode, le jeu continue de tourner en arrière-plan même si
htop n’est pas ouvert
Plateformes et résolution de problèmes
- Les tests n’ont été effectués que sur Ubuntu 22.04
- Sur WSL et Arch, le nom du périphérique clavier diffère et un portage est nécessaire
- Si le clavier ne fonctionne pas, il faut vérifier la valeur de
#define KEYBOARD_DEVICE dans main.c
- Il est recommandé de chercher dans
/dev/input/by-path une entrée contenant kbd et de la sélectionner
- Si l’image reste figée, il est possible que la commande
sed n’ait pas été appliquée
- Il est aussi possible de le régler manuellement dans
htop via F2 → “Display options” → “Update process names on every refresh”
- Une erreur indiquant que
~/.config/htop/htoprc n’existe pas peut survenir si htop n’a jamais été lancé
- Il suffit alors de lancer
htop, de le quitter, puis de relancer la commande sed
- Si le processus principal de Doom plante et laisse de nombreux processus zombies, on peut nettoyer avec la commande suivante
sudo pkill doom-htop
Travaux restants et licence
htop peut déplacer l’écran quand on utilise les touches fléchées, ce qui peut gêner le contrôle du jeu
- Une parade simple consiste à appuyer sur
a après le démarrage du jeu pour déplacer le focus vers le menu de sélection des processeurs
- La raison de la création était funny
- Freedoom est distribué sous une licence de type BSD figurant dans
freedoom-license.txt à la racine
- Le reste du code semble être sous GPL
1 commentaires
Commentaires Hacker News
À y réfléchir, rendre une « vidéo » en ASCII puis la mettre dans des noms de processus semble presque assez simple
C’est un peu comme les projets-jouets qui tournent au-dessus de DNS, et comme le README dit que l’essentiel du travail a été fait par d’autres projets, ça peut ne pas sembler si spécial
En revanche, je n’aurais jamais pensé à voir htop comme un moteur de rendu pour quoi que ce soit ; c’est donc un hack logiciel vraiment surprenant et impressionnant
Rien qu’avec libaa ou libcaca, on voit des exemples de centaines d’heures passées sur ce sujet
C’est un peu comme un PSDoom[1] inversé, j’imagine
Ici, on joue à Doom dans un gestionnaire de processus, tandis qu’avec PSDoom on gère les processus dans Doom
[1]: https://psdoom.sourceforge.net
Il y a aussi une vidéo d’un portage qui tourne sur Linux actuel : https://youtu.be/Pf7rpde49NU
Cela dit, ce serait bien que ce soit un peu plus réellement utile comme remplaçant de top. La taille des monstres pourrait être basée sur l’utilisation mémoire, leur agressivité sur l’utilisation CPU, les salles séparées par utilisateur, et les threads ainsi que les relations parent/enfant entre processus pourraient être visibles
Les processus endormis dormiraient évidemment, et les processus zombies pourraient être figés dans l’espace ou transparents, pour qu’on puisse les traverser. Les armes correspondraient aux signaux kill
Il y aurait beaucoup d’autres choses à ajouter, mais on s’éloignerait de plus en plus de Doom
rm -rfJe me demande vraiment comment les gens trouvent le temps de faire ce genre de choses
Plus je vois des trucs aussi cool, moins j’ai confiance en mes propres capacités
Certains ont dit que ça réutilisait des travaux existants, avec un nouveau rendu en ASCII et un mapping vers les processus, mais ce n’est certainement pas peu de travail
Je me demande combien de temps ça a pris, et même après avoir passé pas mal de temps dans ce secteur, j’ai l’impression de ne rien savoir. C’est génial, mais ça me donne l’impression d’être incroyablement idiot
Il y a de bonnes chances que tu en saches bien plus que tu ne le penses
Ce projet a été fait sur tout un week-end plus environ une journée, puis quelques petites sessions supplémentaires sur plusieurs jours quand j’avais du temps
Comme je l’ai écrit quelque part dans les commentaires et dans le README, le gros travail difficile pour rendre Doom plus portable avait été fait par le projet doom-generic dont c’est un fork : https://github.com/ozkl/doomgeneric
Il faut manger, dormir, se laver et faire tout un tas de choses, mais si tu n’en tiens pas compte, il reste toujours 15 heures
En 3 ans, il y a largement le temps de le faire
Maintenant, il faut que je finisse mon raycaster pour 6502
C’est comme la version programmeur de se dévaloriser en regardant les photos de maisons parfaites que des amis postent sur Instagram
La plupart des gens ressentent ça de temps en temps, et il existe des façons d’y faire face, mais c’est un effet secondaire tout à fait normal quand on côtoie des gens intelligents
J’ai l’impression que le courant « mettre Doom dans quelque chose » a presque atteint son terme, et qu’il est temps de commencer à mettre des choses du quotidien dans Doom
Imaginez une todo list ou un calendrier dans Doom
Côté application de todo, il existe déjà Doom rendu avec des cases à cocher[1], donc l’intégrer à une app de todo est laissé en exercice au lecteur
[1]: https://healeycodes.github.io/doom-checkboxes/
Je suis tombé sur ce projet il y a environ une semaine et je l’ai posté ici, mais il n’y a pas eu de réaction
Je suis content de le voir maintenant en page d’accueil, et j’aime voir remonter ce genre de projet hacky surtout fait pour le fun
Excellent hack
Ça fait plaisir de voir que l’esprit hacker est encore vivant
Parfois, les gens poussent la technologie trop loin, mais ce n’est pas le cas ici
Ça me rappelle Bad Apple lancé dans le Gestionnaire des tâches de Windows
https://youtu.be/sBeI30ccb6g
De la folie pure et magnifique. A+
Je n’arrive même pas à imaginer où ce jeu tournera ensuite