2 points par GN⁺ 2024-04-22 | 1 commentaires | Partager sur WhatsApp
  • 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

 
GN⁺ 2024-04-22
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

    • À première vue, ça peut paraître facile, mais en pratique obtenir un bon contraste et de bonnes performances n’a rien de trivial
      Rien qu’avec libaa ou libcaca, on voit des exemples de centaines d’heures passées sur ce sujet
    • C’est peut-être facile à comprendre conceptuellement, mais l’implémentation a l’air assez difficile
  • 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

    • J’allais écrire que j’aimerais voir l’inverse, mais je ne suis pas surpris que ça existe déjà
      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
    • Ce serait amusant à utiliser avec rm -rf
  • Je 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

    • Merci pour les mots bienveillants, et inutile de trop te flageller
      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
    • Si tu travailles 8 heures par jour et que tu as 1 heure de trajet, il reste 15 heures
      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
    • Je connais trop bien ce sentiment
      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
    • Chaque fois que je vois ce genre de chose, ça me rappelle l’époque où je n’avais pas d’enfant
  • 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

    • À proprement parler, ce ne serait pas une todo list ou un calendrier dans Doom, mais Doom qui tourne dans une todo list ou un calendrier
      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/
    • Si tu as l’impression que le courant « mettre Doom dans quelque chose » touche à sa fin, c’est que tu dois être nouveau dans ce monde
    • J’ai pensé exactement la même chose quand j’ai vu « des oiseaux jouent à DOOM »
  • 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