2 pontos por GN⁺ 2024-04-22 | 1 comentários | Compartilhar no WhatsApp
  • 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

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

    • Pensando por alto parece fácil, mas, na prática, obter bom contraste e desempenho não é algo tão trivial
      Basta olhar para libaa ou libcaca para ver exemplos de centenas de horas gastas nesse tema
    • Conceitualmente pode ser fácil de entender, mas a implementação parece bem difícil
  • 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

    • Eu ia escrever que queria ver o caminho inverso, mas não me surpreende que já exista
      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
    • Deve ficar divertido usando junto com rm -rf
  • Fico 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

    • Obrigado pelas palavras gentis, e não precisa se culpar tanto
      É 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
    • Se você trabalha 8 horas por dia e leva 1 hora no deslocamento, ainda sobram 15 horas
      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
    • Essa sensação é familiar demais
      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
    • Toda vez que vejo algo assim, lembro da época em que eu não tinha filhos
  • 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

    • Tecnicamente, isso não seria uma lista de tarefas ou um calendário dentro de Doom, mas Doom rodando dentro de uma lista de tarefas ou de um calendário
      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/
    • Se você sente que a tendência de “colocar Doom em alguma coisa” está chegando ao fim, parece que ainda é novo neste mundo
    • Pensei exatamente a mesma coisa quando vi “pássaros jogam DOOM”
  • 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