- doom-htop é um projeto experimental que usa a lista de processos do
htop como se fosse uma saída gráfica para mostrar a tela de jogos da família Doom em forma de ASCII
- Para executar, é necessário um arquivo de dados de jogo WAD; o repositório inclui freedoom1.wad, e o classic shareware
DOOM1.wad é indicado como download separado
- O funcionamento consiste em o processo do Doom criar processos filhos na quantidade de linhas da tela; cada processo escreve uma linha recebida da memória compartilhada em seu próprio argv[0], formando o frame na área de nomes de processos do
htop
- O
htop precisa ser configurado para atualizar os nomes dos processos a cada vez; com -d 1, o objetivo é uma atualização de cerca de 10 FPS, e com -s M_VIRT é usada a ordenação por memória virtual
- A entrada pelo teclado usa um método simples de keylogger que abre o dispositivo de teclado, então pode ser necessário
sudo; ele foi testado apenas no Ubuntu 22.04, e WSL e Arch exigem ajuste no caminho do dispositivo
Objetivo do projeto e forma de execução
- doom-htop é um projeto criado para verificar se o
htop poderia ser usado para renderizar gráficos de videogames clássicos
- O resultado exibe Doom sobre a lista de processos do
htop, como um vídeo em ASCII
- O projeto é um fork de ozkl/doomgeneric, e esse projeto cuida do trabalho pesado relacionado à execução do Doom
Build e dados de jogo necessários
- O build é feito no diretório
doomgeneric com make -j8
cd doomgeneric
make -j8
- Para executar, é necessário um arquivo de dados de jogo WAD
- O repositório inclui
freedoom1.wad, com créditos para The Freedoom project
- A versão classic free shareware
DOOM1.wad pode ser obtida na Doom Wiki
DOOM1.wad não foi incluído porque não havia certeza se seria legalmente aceitável enviá-lo ao GitHub
Como executar e configuração do htop
- Há uma orientação para salvar trabalhos importantes antes de executar; o ambiente de teste foi um Lenovo ThinkPad T430s de 12 anos, 8 GB de RAM, Intel Core i7-3520M @ 2.90 GHz, Ubuntu 22.04, onde funcionou corretamente
- O comando básico de execução é o seguinte
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
- Tanto faz executar
doom-htop ou htop primeiro
sudo é necessário apenas para abrir o dispositivo de teclado
- Se for executado sem
sudo, a entrada será difícil, mas a tela poderá ser vista
htop -d 1 é uma configuração voltada para uma atualização de 10 FPS
htop -s M_VIRT é uma configuração para ordenar os processos pela quantidade de memória virtual alocada, de modo que os processos relacionados fiquem agrupados de forma visualmente organizada
- Se a ordenação não ficar adequada, é possível ajustar o valor de
PROCS_MALLOC_SIZE em main.c
- O comando
sed é necessário porque, por padrão, o htop não atualiza os nomes dos processos a cada vez
Funcionamento interno
- O repositório adiciona principalmente três arquivos ao
doomgeneric existente
main.c
keylogger.c
ascii_stuff.c
ascii_stuff.c contém uma longa instrução if gerada por um simples conversor de imagem para ASCII
- O processo principal do Doom cria, com
fork, tantos processos quanto o número de linhas da imagem convertida para ASCII
- O processo principal cria um segmento de memória compartilhada com cada processo filho e copia cada linha da imagem para o segmento de memória do processo correspondente
- Cada processo filho copia o conteúdo de seu segmento e sobrescreve
argv[0]
- O
htop passa a mostrar uma linha da tela por vez ao atualizar o valor de argv[0] exibido como nome do processo
Ideia de ordenação e processamento de entrada
- A ideia inicial era ordenar por uso de CPU, tentando criar processos que consumissem uma taxa específica de CPU, mas a implementação era difícil
- O valor
nice do Linux também foi considerado, mas julgou-se que os apenas 19 valores possíveis para usuários comuns seriam insuficientes para gráficos melhores
- No fim, foi usada a quantidade de memória virtual alocada, considerada ajustável de forma bastante específica por processo
- Mesmo quando todos os processos criados por fork alocavam a mesma quantidade de memória, no sistema de teste o
htop mostrava os frames na ordem correta
- Supõe-se que, em caso de empate, a ordenação possa ocorrer pelo horário de criação
- No entanto, como não havia certeza de como isso se comportaria em outros sistemas, o projeto não depende de valores iguais
- A entrada de teclas é tratada por um keylogger simples que abre o dispositivo de teclado
- Graças a esse método, o jogo continua rodando em segundo plano mesmo que o
htop não esteja aberto
Plataformas e solução de problemas
- Os testes foram realizados apenas no Ubuntu 22.04
- No WSL e no Arch, o nome do dispositivo de teclado é diferente e é necessária portabilidade
- Se o teclado não funcionar, é preciso verificar o valor de
#define KEYBOARD_DEVICE em main.c
- É indicado procurar em
/dev/input/by-path por um item que contenha kbd e selecioná-lo
- Se o frame ficar parado, o comando
sed pode não ter sido aplicado
- É possível configurar manualmente no
htop em F2 → “Display options” → “Update process names on every refresh”
- O erro de que
~/.config/htop/htoprc não existe pode ocorrer quando o htop nunca foi executado
- Basta executar o
htop, encerrá-lo e rodar o comando sed novamente
- Se o processo principal do Doom travar e deixar muitos processos zumbis, limpe com o seguinte comando
sudo pkill doom-htop
Trabalhos restantes e licença
- O
htop pode mover a tela ao usar as setas, o que pode ser inconveniente durante o controle do jogo
- É sugerido um contorno simples: depois de iniciar o jogo, pressionar
a para mudar o foco para o menu de seleção de processador
- O motivo da criação foi funny
- Freedoom é distribuído sob uma licença semelhante à BSD, presente em
freedoom-license.txt no diretório principal
- O restante do código é indicado como aparentemente GPL
1 comentários
Opiniões do Hacker News
Pensando bem, renderizar “vídeo” em ASCII e depois colocá-lo no nome dos processos parece até bem fácil
É parecido com aqueles projetos de brincadeira que rodam em cima de DNS e, como o README também diz que a maior parte do trabalho foi feita por outro projeto, pode não parecer algo especial
Por outro lado, acho que eu jamais teria pensado em ver o htop como um mecanismo de renderização para alguma coisa; então é um hack de software realmente surpreendente e impressionante
Basta olhar para libaa ou libcaca para ver exemplos de centenas de horas gastas nesse tema
Parece uma espécie de PSDoom[1] ao contrário
Este envio é jogar Doom com um gerenciador de processos, enquanto PSDoom é fazer gerenciamento de processos com Doom
[1]: https://psdoom.sourceforge.net
Também há um vídeo de uma versão portada para rodar no Linux atual: https://youtu.be/Pf7rpde49NU
Mas seria bom se fosse um pouco mais útil de verdade como substituto do top. O tamanho dos monstros poderia ser baseado no uso de memória, a agressividade no uso de CPU, as salas separadas por usuário, e threads e processos pai/filho poderiam mostrar suas relações
Processos em sleep obviamente dormiriam, e processos zumbis poderiam ficar congelados no espaço ou transparentes, permitindo atravessar. As armas poderiam corresponder a sinais kill
Dá para acrescentar muita coisa, mas aí vai se afastando cada vez mais de Doom
rm -rfFico realmente curioso para saber como as pessoas arranjam tempo para fazer esse tipo de coisa
Quanto mais vejo coisas legais assim, menos confiança tenho nas minhas próprias capacidades
Também disseram que foi algo que aproveitou trabalhos anteriores, renderizou de novo em ASCII e mapeou para processos, mas isso de forma alguma é pouco trabalho
Fico imaginando quanto tempo levou e, mesmo estando há bastante tempo neste setor, sinto que não sei nada. É legal, mas me faz sentir extremamente burro
É bem provável que você saiba muito mais do que pensa
Este trabalho foi feito ao longo de um fim de semana inteiro e mais ou menos um dia, além de alguns ajustes em outros dias quando dava tempo
Como escrevi em algum comentário e também no README, o trabalho difícil de tornar Doom mais portátil foi feito pelo projeto doom-generic que eu forkei: https://github.com/ozkl/doomgeneric
Precisa comer, dormir, tomar banho e fazer várias outras coisas, mas, se não se importar com isso, as 15 horas continuam sobrando
Em 3 anos dá tempo suficiente para fazer
Agora preciso terminar aquele raycaster para 6502
Parece a versão programador de ficar vendo no Instagram as fotos de casas perfeitas dos amigos e destruir a própria autoestima
A maioria provavelmente se sente assim às vezes, e há formas de lidar com isso, mas é um efeito colateral muito normal de estar perto de pessoas inteligentes
A tendência de “colocar Doom em alguma coisa” parece ter chegado quase ao estágio final; agora está na hora de começar a colocar coisas do dia a dia dentro de Doom
Basta imaginar uma lista de tarefas ou um calendário dentro de Doom
Do lado do app de tarefas, já existe Doom renderizado com caixas de seleção[1], então integrar isso a um app de tarefas fica como exercício para o leitor
[1]: https://healeycodes.github.io/doom-checkboxes/
Encontrei este projeto por acaso cerca de uma semana atrás e postei aqui, mas não teve reação
Agora é bom ver que chegou à front page, e gosto quando aparecem projetos hacky voltados à diversão como este
Um hack excelente
Dá uma sensação boa ver que o espírito hacker ainda está vivo
Às vezes as pessoas levam a tecnologia longe demais, mas este não é o caso
Isso me lembrou Bad Apple rodando no Gerenciador de Tarefas do Windows
https://youtu.be/sBeI30ccb6g
Loucura pura e maravilhosa. A+
Nem consigo imaginar onde este jogo ainda vai rodar no futuro