2 Punkte von GN⁺ 2024-04-22 | 1 Kommentare | Auf WhatsApp teilen
  • doom-htop ist ein experimentelles Projekt, das die Prozessliste von htop als grafische Ausgabe verwendet und den Bildschirm eines Doom-artigen Spiels in ASCII-Form darstellt
  • Für die Ausführung wird eine WAD-Spieldatendatei benötigt; im Repository ist freedoom1.wad enthalten, während für das klassische Shareware-DOOM1.wad auf einen separaten Download verwiesen wird
  • Die Funktionsweise besteht darin, dass der Doom-Prozess so viele Kindprozesse erzeugt wie Bildschirmzeilen vorhanden sind und jeder Prozess eine aus dem Shared Memory erhaltene Zeile in sein eigenes argv[0] schreibt, um im Bereich für Prozessnamen von htop ein Frame aufzubauen
  • htop muss so eingestellt werden, dass Prozessnamen bei jeder Aktualisierung neu eingelesen werden; mit -d 1 wird eine Aktualisierung von etwa 10 FPS angestrebt, und mit -s M_VIRT wird nach virtuellem Speicher sortiert
  • Die Tastatureingabe erfolgt über einen einfachen Keylogger-Ansatz, der das Tastaturgerät öffnet, weshalb sudo nötig sein kann; getestet wurde nur unter Ubuntu 22.04, und bei WSL sowie Arch muss der Gerätepfad angepasst werden

Projektziel und Ausführungsform

  • doom-htop ist ein Projekt, das prüfen soll, ob sich htop zum Rendern klassischer Videospielgrafik verwenden lässt
  • Das Ergebnis zeigt Doom als ASCII-Bild über der Prozessliste von htop
  • Das Projekt ist ein Fork von ozkl/doomgeneric, das die aufwendigen Teile der Doom-Ausführung übernimmt

Build und benötigte Spieldaten

  • Der Build wird im Verzeichnis doomgeneric mit make -j8 ausgeführt
cd doomgeneric
make -j8
  • Für die Ausführung wird eine WAD-Spieldatendatei benötigt
    • Im Repository ist freedoom1.wad enthalten; die Credits gehen an The Freedoom project
    • Die klassische kostenlose Shareware-Version DOOM1.wad kann von Doom Wiki heruntergeladen werden
    • DOOM1.wad wurde nicht aufgenommen, da nicht sicher war, ob das rechtlich auf GitHub in Ordnung wäre

Ausführung und htop-Konfiguration

  • Vor dem Start wird empfohlen, wichtige Arbeit zu speichern; die Testumgebung war ein 12 Jahre altes Lenovo ThinkPad T430s mit 8 GB RAM, Intel Core i7-3520M @ 2.90GHz und Ubuntu 22.04, wo es korrekt funktionierte
  • Der Standardbefehl zur Ausführung lautet wie folgt
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
  • Es ist egal, ob zuerst doom-htop oder htop gestartet wird
  • sudo wird nur benötigt, um das Tastaturgerät zu öffnen
    • Ohne sudo ist die Eingabe schwierig, aber der Bildschirm lässt sich trotzdem ansehen
  • htop -d 1 ist auf eine Aktualisierung von 10 FPS ausgelegt
  • htop -s M_VIRT sortiert nach der zugewiesenen Menge an virtuellem Speicher, damit die zugehörigen Prozesse übersichtlich gruppiert werden
  • Wenn die Sortierung nicht gut passt, kann der Wert PROCS_MALLOC_SIZE in main.c angepasst werden
  • Der sed-Befehl ist nötig, weil htop Prozessnamen standardmäßig nicht bei jeder Aktualisierung neu einliest

Interne Funktionsweise

  • Dem bestehenden doomgeneric fügt das Repository hauptsächlich drei Dateien hinzu
    • main.c
    • keylogger.c
    • ascii_stuff.c
  • ascii_stuff.c enthält eine lange if-Anweisung, die von einem einfachen Bild-zu-ASCII-Konverter erzeugt wurde
  • Der Haupt-Doom-Prozess erzeugt per fork so viele Prozesse wie die Anzahl der Zeilen im ASCII-konvertierten Bild
  • Der Hauptprozess erstellt mit jedem Kindprozess ein Shared-Memory-Segment und kopiert jede Bildzeile in das Speichersegment des entsprechenden Prozesses
  • Jeder Kindprozess kopiert den Inhalt aus seinem Segment und überschreibt damit argv[0]
  • htop aktualisiert den als Prozessnamen angezeigten Wert argv[0] und zeigt so Zeile für Zeile des Bildschirms an

Sortierungsidee und Eingabeverarbeitung

  • Die ursprüngliche Idee war, nach CPU-Auslastung zu sortieren und Prozesse zu erzeugen, die eine bestimmte CPU-Last verbrauchen, doch das war schwer umzusetzen
  • Auch Linux-nice-Werte wurden in Betracht gezogen, aber da regulären Nutzern nur 19 Werte zur Verfügung stehen, wurde das für bessere Grafik als unzureichend angesehen
  • Letztlich wurde die Zuweisung von virtuellem Speicher verwendet, da sie sich pro Prozess recht fein abstimmen lässt
  • Selbst wenn alle geforkten Prozesse gleich viel Speicher zuweisen, zeigt htop auf dem Testsystem die Frames in der richtigen Reihenfolge an
    • Es wird vermutet, dass Gleichstände dann nach Erstellungszeit sortiert werden
    • Wie sich das auf anderen Systemen verhält, ist jedoch unklar, weshalb man sich nicht auf identische Werte verlässt
  • Die Tasteneingabe wird über einen einfachen Keylogger verarbeitet, der das Tastaturgerät öffnet
    • Dadurch läuft das Spiel auch dann im Hintergrund weiter, wenn htop nicht geöffnet ist

Plattformen und Fehlerbehebung

  • Getestet wurde ausschließlich unter Ubuntu 22.04
  • Unter WSL und Arch haben die Tastaturgeräte andere Namen und müssen angepasst werden
  • Wenn die Tastatur nicht funktioniert, sollte der Wert von #define KEYBOARD_DEVICE in main.c geprüft werden
    • Empfohlen wird, unter /dev/input/by-path einen Eintrag mit kbd zu suchen und diesen auszuwählen
  • Wenn das Frame eingefroren wirkt, wurde der sed-Befehl möglicherweise nicht angewendet
    • In htop kann dies auch manuell über F2 → „Display options“ → „Update process names on every refresh“ aktiviert werden
  • Ein Fehler, dass ~/.config/htop/htoprc nicht existiert, kann auftreten, wenn htop noch nie gestartet wurde
    • In diesem Fall htop einmal starten und beenden und danach den sed-Befehl erneut ausführen
  • Wenn der Haupt-Doom-Prozess abstürzt und viele Zombie-Prozesse zurückbleiben, können sie mit folgendem Befehl bereinigt werden
sudo pkill doom-htop

Offene Punkte und Lizenz

  • htop bewegt den Bildschirm bei Navigation mit den Pfeiltasten, was die Spielsteuerung stören kann
    • Als einfacher Workaround wird vorgeschlagen, nach dem Spielstart a zu drücken, um den Fokus auf das Prozessorauswahlmenü zu verlagern
  • Der Grund für die Erstellung war funny
  • Freedoom wird unter einer BSD-ähnlichen Lizenz ausgeliefert, die in freedoom-license.txt im Hauptverzeichnis steht
  • Für den restlichen Code wird angegeben, dass er offenbar unter GPL steht

1 Kommentare

 
GN⁺ 2024-04-22
Meinungen auf Hacker News
  • Wenn man darüber nachdenkt, wirkt es ziemlich einfach, „Video“ als ASCII zu rendern und dann in Prozessnamen zu stecken.
    Ähnlich wie diese Spielzeugprojekte, die über DNS laufen; und da im README auch steht, dass der Großteil der Arbeit von anderen Projekten erledigt wurde, wirkt es vielleicht nicht besonders.
    Andererseits wäre ich wohl nie auf die Idee gekommen, htop als Rendering-Engine für irgendetwas zu sehen – insofern ist das ein wirklich überraschender und beeindruckender Software-Hack.

    • Grob gedacht wirkt es einfach, aber in der Praxis sind guter Kontrast und Performance nicht so trivial.
      Schon libaa oder libcaca zeigen, dass Leute Hunderte Stunden in dieses Thema gesteckt haben.
    • Konzeptionell mag es leicht zu verstehen sein, aber die Implementierung sieht ziemlich schwierig aus.
  • So etwas wie ein umgekehrtes PSDoom[1], schätze ich.
    Bei diesem Beitrag spielt man Doom mit einem Prozessmanager, und bei PSDoom verwaltet man Prozesse mit Doom.
    [1]: https://psdoom.sourceforge.net

    • Ich wollte gerade schreiben, dass ich auch die Gegenrichtung sehen möchte, aber es überrascht mich nicht, dass es das schon gibt.
      Es gibt auch ein Video einer Portierung, die unter aktuellem Linux läuft: https://youtu.be/Pf7rpde49NU
      Es wäre allerdings schön, wenn es als top-Ersatz etwas tatsächlich Nützlicheres wäre. Die Monstergröße könnte auf der Speichernutzung basieren, die Aggressivität auf der CPU-Auslastung, Räume könnten nach Benutzern getrennt sein, und Threads sowie Eltern-/Kindprozesse könnten ihre Beziehungen sichtbar machen.
      Schlafende Prozesse schlafen natürlich, und Zombie-Prozesse könnten im Raum eingefroren oder transparent und passierbar sein. Waffen ließen sich kill-Signalen zuordnen.
      Man könnte noch viel mehr hinzufügen, aber dann entfernt es sich immer weiter von Doom.
    • Zusammen mit rm -rf wäre das sicher lustig.
  • Ich frage mich wirklich, wie Leute Zeit für so etwas finden.
    Je mehr ich solche coolen Sachen sehe, desto weniger Vertrauen habe ich in meine eigenen Fähigkeiten.
    Es wurde zwar auch gesagt, dass hier frühere Arbeit genutzt, neu als ASCII gerendert und auf Prozesse gemappt wurde, aber das ist keineswegs wenig Arbeit.
    Ich frage mich, wie lange das gedauert hat; obwohl ich schon ziemlich lange in dieser Branche bin, fühlt es sich an, als wüsste ich gar nichts. Cool, aber ich fühle mich dabei unglaublich dumm.

    • Danke für die warmen Worte, und du musst dich nicht so fertig machen.
      Wahrscheinlich weißt du viel mehr, als du selbst glaubst.
      Diese Arbeit ist an einem ganzen Wochenende plus ungefähr einem Tag entstanden, und dann noch ein paar Tage hier und da, wenn Zeit war.
      Wie ich irgendwo in den Kommentaren und auch im README geschrieben habe, wurde die schwierige Arbeit, Doom portabler zu machen, vom geforkten doom-generic-Projekt erledigt: https://github.com/ozkl/doomgeneric
    • Wenn man 8 Stunden am Tag arbeitet und 1 Stunde pendelt, bleiben 15 Stunden übrig.
      Man muss essen, schlafen, duschen und sonst noch einiges tun, aber wenn man das ignoriert, bleiben die 15 Stunden komplett übrig.
      In 3 Jahren hat man genug Zeit, so etwas zu bauen.
      Jetzt sollte ich wohl meinen Raycaster für den 6502 fertigstellen.
    • Das fühlt sich nur allzu vertraut an.
      Es ist wie die Programmierer-Version davon, sein Selbstwertgefühl zu ruinieren, indem man sich auf Instagram die perfekten Häuser von Freunden ansieht.
      Die meisten fühlen sich wohl gelegentlich so, und es gibt Wege, damit umzugehen; aber es ist ein völlig normaler Nebeneffekt, wenn man von klugen Leuten umgeben ist.
    • Jedes Mal, wenn ich so etwas sehe, erinnert es mich an die Zeit, bevor ich Kinder hatte.
  • Der Trend „Doom in irgendetwas stecken“ fühlt sich an, als hätte er fast seinen Endpunkt erreicht; jetzt ist es an der Zeit, alltägliche Dinge in Doom zu stecken.
    Man kann sich eine Todo-Liste oder einen Kalender in Doom vorstellen.

    • Streng genommen wäre das keine Todo-Liste oder kein Kalender in Doom, sondern Doom, das in einer Todo-Liste oder einem Kalender läuft.
      Für Todo-Apps gibt es schon Doom, das mit Checkboxen gerendert wird[1]; die Integration in eine Todo-App kann man dann als Übung für die Leserschaft übrig lassen.
      [1]: https://healeycodes.github.io/doom-checkboxes/
    • Wenn du das Gefühl hast, der Trend „Doom in irgendetwas stecken“ gehe zu Ende, bist du in dieser Welt wohl noch neu.
    • Dasselbe dachte ich, als ich „Vögel spielen DOOM“ gesehen habe.
  • Ich bin vor etwa einer Woche zufällig auf dieses Projekt gestoßen und habe es hier eingereicht, aber es gab keine Reaktion.
    Schön zu sehen, dass es jetzt auf der Frontpage gelandet ist, und ich mag es, wenn solche spaßorientierten, hackigen Projekte auftauchen.

  • Großartiger Hack.
    Es tut gut zu sehen, dass der Hackergeist noch lebt.

  • Manchmal treiben Menschen Technik zu weit, aber das hier ist keiner dieser Fälle.

  • Erinnert mich an Bad Apple, das im Windows-Task-Manager läuft.
    https://youtu.be/sBeI30ccb6g

  • Pure, großartige Verrücktheit. A+

  • Ich kann mir nicht einmal vorstellen, wo dieses Spiel als Nächstes noch laufen wird.