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

Escrevendo um videogame do zero como se fosse 1987

O que estamos criando

  • A 11ª versão do protocolo X nasceu em 1987.
  • O X11 é um modelo anterior ao surgimento da GPU, então não combina muito bem com o hardware atual.
  • Todo sistema Unix tem um servidor X, e também é possível executar aplicativos Linux com GUI no macOS e no Windows.
  • O protocolo X11 é relativamente simples, e é possível começar apenas criando um socket.
  • No caso de aplicativos 2D, eles podem funcionar sem precisar interagir com a GPU.

Autenticação

  • No artigo anterior, a conexão com o servidor X foi feita sem autenticação.
  • Agora há suporte ao protocolo de autenticação do X.
  • Isso acontece porque alguns ambientes de desktop que usam XWayland exigem autenticação.
  • A autenticação é tratada com o mecanismo MIT-MAGIC-COOKIE-1.

Abrindo uma janela

  • Um socket de domínio UNIX é aberto para se comunicar com o servidor X.
  • A conexão com o servidor é estabelecida por meio do handshake do X11.
  • Um contexto gráfico é criado e a janela é aberta.
  • A chamada map_window é usada para exibir a janela.

Carregando recursos

  • As imagens necessárias para o jogo são carregadas e convertidas para o formato de imagem do X11.
  • Um Pixmap é criado, a imagem é enviada e, depois, as partes necessárias são copiadas para a janela.

Opinião do GN⁺

  • Simplicidade do X11: o protocolo X11 é relativamente simples, o que permite comunicação direta por socket. Isso ajuda engenheiros iniciantes a entender conceitos básicos de programação em rede e GUI.
  • Possibilidades de otimização: usando buffers off-screen como Pixmap, é possível enviar a imagem apenas uma vez e depois copiá-la rapidamente. Esse é um bom exemplo de otimização de desempenho.
  • Vantagens da linguagem Odin: a linguagem Odin oferece recursos que simplificam tarefas complexas, como gerenciamento de memória. Isso permite programação eficiente.
  • Suporte a sistemas legados: esse método pode funcionar até em sistemas antigos. Isso é útil quando é necessário executar software em ambientes diversos.
  • Recurso de aprendizado: lidar diretamente com protocolos de baixo nível como o X11 ajuda bastante a entender o funcionamento interno de GUIs. Isso pode contribuir para a evolução técnica de engenheiros.

1 comentários

 
GN⁺ 2024-06-22
Comentários do Hacker News
  • Primeiro comentário: Os PCs de 1987 tinham 1–2 MB de RAM, e o Super NES tinha 128 KB de RAM. Criavam arquivos executáveis muito menores do que os programas da Microsoft. Link

  • Segundo comentário: O X11 é antigo, mas se você implementar apenas as funcionalidades básicas necessárias para desenvolvimento de jogos, não precisa se preocupar com o resto. Usar Xlib pode facilitar o trabalho.

  • Terceiro comentário: Desenvolveu um clone de Campo Minado para PC com DOS em Turbo Pascal. Teve problemas com algoritmos recursivos em fases grandes e adicionou um recurso para escolher com segurança a posição inicial.

  • Quarto comentário: Desenvolver jogos em 1987 era muito mais difícil do que hoje. O DOS não suportava multitarefa, então o fluxo de trabalho era muito ineficiente. Link

  • Quinto comentário: Ficou decepcionado porque o arquivo wasm do motor Godot tem no mínimo 50 MB. Especialmente em jogos 2D simples, é necessário otimizar. No geral, achou impressionante.

  • Sexto comentário: Passou a se interessar pela linguagem Odin. Assim como Zig, Odin passa alocadores de memória para funções, mas tem um mecanismo que permite lidar com isso de forma mais simples.

  • Sétimo comentário: O Campo Minado do Windows 3.1 tinha um código de trapaça. Ao inserir uma combinação específica de teclas, era possível distinguir casas seguras das casas com bombas.

  • Oitavo comentário: Ao usar uma biblioteca como SDL, quase não há overhead e é possível oferecer suporte a vários sistemas operacionais. Com o legado SDL 1.x, também dá para suportar versões antigas do Linux.

  • Nono comentário: O executável do Mines para Windows de Simon Tatham tem cerca de 180 KiB. Link