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
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