- 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
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.
Schon libaa oder libcaca zeigen, dass Leute Hunderte Stunden in dieses Thema gesteckt haben.
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
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.
rm -rfwä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.
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
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.
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.
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.
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/
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.