- doom-htop es un proyecto experimental que usa la lista de procesos de
htop como si fuera una salida gráfica para mostrar una pantalla de juegos tipo Doom en formato ASCII
- Para ejecutarlo se necesita un archivo de datos del juego WAD; el repositorio incluye freedoom1.wad, y el clásico shareware
DOOM1.wad se indica como descarga aparte
- Funciona haciendo que el proceso de Doom cree procesos hijo equivalentes al número de líneas de la pantalla, y cada proceso escribe en su propio argv[0] una línea recibida desde memoria compartida para componer cada cuadro en el área de nombres de proceso de
htop
- Hay que configurar
htop para que actualice siempre los nombres de los procesos; con -d 1 se busca una actualización de alrededor de 10 FPS, y con -s M_VIRT se usa ordenamiento por memoria virtual
- La entrada de teclado usa un método simple tipo keylogger que abre el dispositivo de teclado, así que puede requerir
sudo; solo se probó en Ubuntu 22.04, y en WSL y Arch hace falta ajustar la ruta del dispositivo
Objetivo del proyecto y forma de ejecución
- doom-htop es un proyecto creado para comprobar si
htop puede usarse para renderizar gráficos de videojuegos clásicos
- El resultado muestra Doom como video ASCII sobre la lista de procesos de
htop
- El proyecto hizo un fork de ozkl/doomgeneric, que se encarga del trabajo pesado relacionado con la ejecución de Doom
Compilación y datos del juego necesarios
- La compilación se realiza en el directorio
doomgeneric con make -j8
cd doomgeneric
make -j8
- Para ejecutarlo hace falta un archivo de datos del juego WAD
- El repositorio incluye
freedoom1.wad, con créditos para The Freedoom project
- La versión classic free shareware
DOOM1.wad puede descargarse desde Doom Wiki
DOOM1.wad no se incluyó porque no había certeza de si era legalmente correcto subirlo a GitHub
Cómo ejecutarlo y configuración de htop
- Antes de ejecutarlo se recomienda guardar cualquier trabajo importante; el entorno de prueba fue una Lenovo ThinkPad T430s de 12 años, con 8 GB de RAM, Intel Core i7-3520M @ 2.90GHz y Ubuntu 22.04, donde funcionó correctamente
- El comando básico de ejecución es el siguiente
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
- No importa si se inicia primero
doom-htop o htop
sudo solo es necesario para abrir el dispositivo de teclado
- Si se ejecuta sin
sudo, la entrada será difícil, pero la pantalla se podrá ver
htop -d 1 es una configuración pensada para apuntar a 10 FPS de actualización
htop -s M_VIRT ordena los procesos según la asignación de memoria virtual para que los procesos relacionados queden agrupados de forma más clara
- Si el orden no queda bien, se puede ajustar el valor de
PROCS_MALLOC_SIZE en main.c
- El comando
sed es necesario porque htop no actualiza por defecto el nombre de los procesos en cada refresco
Funcionamiento interno
- El repositorio añade principalmente tres archivos al
doomgeneric original
main.c
keylogger.c
ascii_stuff.c
ascii_stuff.c contiene una larga cadena de sentencias if generadas por un conversor simple de imagen a ASCII
- El proceso principal de Doom crea con
fork tantos procesos como líneas tenga la imagen convertida a ASCII
- El proceso principal crea un segmento de memoria compartida con cada proceso hijo y copia cada línea de la imagen al segmento de memoria del proceso correspondiente
- Cada proceso hijo copia el contenido de su segmento y sobrescribe su
argv[0]
htop va actualizando el valor de argv[0], mostrado como nombre del proceso, y así enseña una línea de la pantalla por cada proceso
Idea de ordenamiento y manejo de entrada
- La idea inicial era ordenar por uso de CPU y crear procesos que consumieran porcentajes específicos de CPU, pero resultó difícil de implementar
- También se consideró el valor
nice de Linux, pero como los usuarios normales solo disponen de 19 valores posibles, se concluyó que no bastaba para obtener mejores gráficos
- Al final se usó la asignación de memoria virtual, al considerar que podía ajustarse con bastante detalle por proceso
- Incluso si todos los procesos creados con fork asignan la misma cantidad de memoria, en el sistema de prueba
htop muestra los cuadros en el orden correcto
- Se supone que, en caso de empate, podría ordenarlos por tiempo de creación
- Aun así, no se depende de valores idénticos porque no hay certeza de cómo se comportará en otros sistemas
- La entrada de teclado se maneja con un keylogger simple que abre el dispositivo de teclado
- Gracias a esto, el juego sigue ejecutándose en segundo plano incluso si
htop no está abierto
Plataforma y solución de problemas
- Las pruebas se hicieron solo en Ubuntu 22.04
- En WSL y Arch el nombre del dispositivo de teclado es distinto, así que hace falta adaptarlo
- Si el teclado no funciona, hay que revisar el valor de
#define KEYBOARD_DEVICE en main.c
- Se indica buscar en
/dev/input/by-path una entrada que contenga kbd y elegirla
- Si el cuadro se queda congelado, puede que el comando
sed no se haya aplicado
- También puede configurarse manualmente en
htop con F2 → “Display options” → “Update process names on every refresh”
- El error de que no existe
~/.config/htop/htoprc puede aparecer si nunca se ha ejecutado htop
- Basta con abrir
htop, salir y luego volver a ejecutar el comando sed
- Si el proceso principal de Doom falla y deja muchos procesos zombi, se pueden limpiar con el siguiente comando
sudo pkill doom-htop
Trabajo pendiente y licencia
htop puede mover la pantalla al usar las flechas de dirección, lo que puede volver incómodo el control del juego
- Se propone una solución simple: después de iniciar el juego, pulsar
a para cambiar el foco al menú de selección de procesadores
- La razón de crear esto fue funny
- Freedoom se distribuye bajo una licencia similar a BSD, indicada en
freedoom-license.txt dentro del directorio principal
- Se indica que el resto del código parece estar bajo GPL
1 comentarios
Opiniones en Hacker News
Si uno lo piensa, renderizar “video” en ASCII y luego ponerlo en los nombres de los procesos parece bastante fácil
Es parecido a esos proyectos de juguete que corren sobre DNS y, como el README dice que la mayor parte del trabajo la hicieron otros proyectos, podría no parecer tan especial
Por otro lado, creo que jamás se me habría ocurrido ver htop como un motor de renderizado para algo, así que es un hack de software realmente sorprendente e impresionante
Basta ver libaa o libcaca: hay ejemplos de cientos de horas invertidas en este tema
Supongo que es como PSDoom[1], pero al revés
En este envío juegas Doom con un gestor de procesos, y PSDoom es gestionar procesos con Doom
[1]: https://psdoom.sourceforge.net
También hay un video de una adaptación que corre en Linux actual: https://youtu.be/Pf7rpde49NU
Eso sí, me gustaría que fuera un poco más útil de verdad como reemplazo de top. El tamaño de los monstruos podría basarse en el uso de memoria, la agresividad en el uso de CPU, las salas separarse por usuario, y también se podrían mostrar las relaciones entre hilos y procesos padre/hijo
Los procesos dormidos, obviamente, estarían dormidos; los procesos zombis podrían quedar congelados en el espacio o ser transparentes para poder atravesarlos. Las armas se mapearían a señales kill
Hay muchas cosas más que se podrían agregar, pero entonces se iría alejando cada vez más de Doom
rm -rfDe verdad me pregunto de dónde saca la gente tiempo para hacer cosas así
Mientras más cosas geniales veo como esta, menos seguro me siento de mis propias capacidades
Aunque se dijo que aprovecharon trabajo previo para volver a renderizar en ASCII y mapearlo a procesos, eso de ningún modo es poco trabajo
Me pregunto cuánto habrá tomado; llevo bastante tiempo en esta industria y aun así siento que no sé nada. Es genial, pero me hace sentir tremendamente tonto
Es muy probable que sepas muchísimo más de lo que crees
Esto lo hice durante todo un fin de semana y más o menos un día, y luego trabajé un poco más durante algunos días cuando tenía tiempo
Como escribí en algún comentario y también en el README, el trabajo difícil de hacer que Doom fuera más portable ya lo hizo el proyecto doom-generic del que hice fork: https://github.com/ozkl/doomgeneric
Hay que comer, dormir, bañarse y hacer otras cosas, pero si no les prestas atención, siguen quedando esas 15 horas
En 3 años hay tiempo de sobra para hacerlo
Ahora debería terminar de una vez mi raycaster para 6502
Es como la versión para programadores de bajarse la autoestima viendo en Instagram las fotos de las casas perfectas de tus amigos
La mayoría probablemente se siente así de vez en cuando, y hay formas de lidiar con ello, pero es un efecto secundario muy normal de estar rodeado de gente inteligente
Siento que la tendencia de “meter Doom en algo” ya está casi completa, y ahora es momento de empezar a meter cosas cotidianas dentro de Doom
Imaginen una lista de pendientes o un calendario dentro de Doom
Del lado de las apps de tareas ya existe Doom renderizado con casillas de verificación[1], así que integrar eso en una app de tareas queda como ejercicio para el lector
[1]: https://healeycodes.github.io/doom-checkboxes/
Me topé con este proyecto hace más o menos una semana y lo publiqué aquí, pero no tuvo reacción
Me alegra verlo ahora en la portada, y me gusta que suban este tipo de proyectos hacky centrados en la diversión
Excelente hack
Da gusto ver que el espíritu hacker sigue vivo
A veces la gente lleva la tecnología demasiado lejos, pero este no es uno de esos casos
Me recordó a Bad Apple corriendo en el Administrador de tareas de Windows
https://youtu.be/sBeI30ccb6g
Locura pura y maravillosa. A+
Ya ni puedo imaginar dónde va a correr este juego la próxima vez