2 pontos por GN⁺ 2024-12-22 | 1 comentários | Compartilhar no WhatsApp

Por que isso foi difícil

  • Problema de desempenho do Bash: O Bash é muito lento, então executar um comando por pixel não consegue alcançar uma taxa de quadros adequada. Não é possível manter o estado da tela em memória e, ao acessar por arrays ou strings, o tempo gasto é alto.
  • Limitações matemáticas: O Bash não tem suporte a ponto flutuante e não possui biblioteca de funções matemáticas. Todas as operações matemáticas são feitas como inteiros, com escala de 100000.
  • Problema de gráficos do terminal: Para representar pixels, foi usado meio-bloco Unicode para dobrar a resolução vertical. É preciso saber a cor dos pixels adjacentes, mas Bash não consegue armazenar estado.
  • Outros problemas:
    • Atualizar o terminal inteiro de uma vez é difícil.
    • A maior parte dos terminais não é feita para videogames, então é difícil tratar entrada de teclado em tempo real.
    • Preencher o terminal com cores requer uma grande quantidade de dados.
    • Bash não imprime múltiplas linhas de string de uma vez.
    • Padrões como ECMA48, VT100, VT200 e Xterm são complicados e difíceis de entender.
    • Havia dificuldades com cálculos matemáticos.

FAQ

  • Q: Há problemas ao redimensionar a janela
    • A: Abra uma issue.
  • Q: A CPU esquenta demais ou computadores antigos ficam lentos
    • A: Tente definir a variável de ambiente FPS abaixo de 30.
  • Q: Não funciona com Bash abaixo da versão 5
    • A: Sim.
  • Q: Esse código é puro Bash?
    • A: Não. No início chamamos stty para desativar o eco e ativá-lo novamente ao encerrar.

1 comentários

 
GN⁺ 2024-12-22
Comentário do Hacker News
  • Como esse jogo nem é realmente 3D, o jeito de renderizar pixels fazendo ray tracing apenas uma vez por coluna é muito esperto

    • Repetindo no terminal a string "desenhe esse pixel e desça" o suficiente para desenhar céu, grama e objetos reais
    • Estou pensando em trabalhar em um motor de renderização em voxel para outros ambientes limitados e parece que isso pode trazer algo útil a esse projeto
  • Se você está curioso se existe um raycaster em MS Batch, pode conferir o link do GitHub

  • Acredito que Bash é lento demais e, por isso, não é adequado para scripts ou uso interativo

    • Algumas distribuições populares do Linux também não usam Bash como shell de script
  • É uma pena que o stty exija fork

    • No próximo projeto, talvez seja possível encontrar uma forma de chamar os ioctls necessários no Bash sem fork usando rowhammer
  • Ainda não entendo o uso de um shell ainda tão lento

    • Já que a maioria dos aplicativos só precisa escrever no stdout e no stderr, eu esperaria que a saída de texto pudesse ser exibida mais rápido
  • Não sabia que isso era possível em Bash

    • Achei que dominava Bash, mas essa implementação me surpreendeu
    • Não tenho muita compreensão matemática, mas é divertido só de assistir
  • Também vale mencionar o raycaster em awk de 9 anos atrás

    • É possível conferir no link do GitHub
  • Uma pena não conseguir executar esse projeto

    • Não sei o motivo, mas a visualização é salva em um arquivo chamado buffered e o programa termina imediatamente
  • Impressiona que tenha apenas 300 linhas de código

    • Gostei bastante desse projeto
  • Esse desafio é realmente enorme

    • É difícil acreditar que isso seja possível