Polígonos Outro Mundo

Existe uma maneira interessante de estudar a arquitetura dos computadores do passado. Encontre um programa que você conhece e tente descobrir como ele foi portado.


Uma boa opção para isso seria DOOM . O megahit de 1994 da id Software foi portado para todo o possível. O jogo é projetado em torno do núcleo, claramente dividido em camadas. Geralmente, é fácil encontrar e ler a implementação dos seis subsistemas de E / S.


Outra opção seria Another World 1991, de Eric Chailly, mais conhecido na América do Norte como Out Of This World . Eu diria que é realmente mais interessante estudar do que DOOM, por causa dos gráficos poligonais adequados para otimizações selvagens . Em alguns casos, acrobacias complicadas permitiram que o jogo trabalhasse em equipamentos criados cinco anos antes do lançamento do jogo.




  1. Polígonos Outro Mundo.
  2. Polígonos Outro Mundo: Amiga 500 .
  3. Polígonos Outro Mundo: Atari ST .

Esta série de artigos é uma jornada pelos equipamentos de videogame do início dos anos 90. Do Amiga 500, Atari ST, IBM PC, Super Nintendo e Sega Genesis. Para cada máquina, tentei descobrir como outro mundo foi implementado.


Na melhor das hipóteses, consegui entrar em contato com o desenvolvedor original. Na pior das hipóteses, eu mesmo tive que descobrir o código desmontado. Foi uma aventura divertida.


Outro mundo 101


Outro mundo tem um pouco de código. A versão inicial do Amiga teria apenas 6.000 linhas. O arquivo executável do DOS no PC é de apenas 20 kB. Surpreendentemente, para um jogo tão grande, que veio em um disquete de 1,44 MiB. Isso ocorre porque a maior parte da lógica de negócios é implementada usando o bytecode. O executável Another World é na verdade o host da máquina virtual que lê e executa os códigos de uint8_t .




A máquina virtual em Another World define 256 variáveis, 64 threads, 29 opcodes e três framebuffers ( tradução do PatientZero ). Isso é tudo. Se você criar um host para a máquina virtual que possa lidar com isso, poderá iniciar o jogo. Se você puder fazer a máquina virtual rápida o suficiente para rodar a 20 quadros por segundo, poderá realmente jogar o jogo.


O sistema gráfico da máquina virtual usa um sistema de coordenadas 320x200 com uma paleta de 16 cores. O limite da paleta pode surpreender, considerando que o Amiga 500 suporta até 32 cores. Isso foi feito propositadamente, o que tornou possível combinar gráficos com outra grande plataforma da época - o Atari ST, que suporta apenas 16 cores.


Mas não há revestimento de prata. Essa limitação levou a um estilo único, que, ao longo dos anos, ainda agrada aos olhos.














Mesmo quando era possível usar uma paleta específica para a cena, Eric Shayi decidiu não usar. Durante uma colisão com a Besta, apenas três cores são usadas para ela: preto para o corpo, vermelho para os olhos e bege para os dentes. A imaginação fez o resto.






Um sistema semelhante para a paleta foi totalmente revelado na cena inicial. Uma mudança de paleta muito barata facilitou a representação de um raio.










O mecanismo também é capaz de criar efeitos translúcidos se houver apenas oito cores em cena.



Aqui as cores são armazenadas em [0x0.0x8].






Os raios dos faróis da Ferrari são translúcidos. Eles são pintados com uma cor especial de 0x10 que não existe, pois apenas 16 cores estão disponíveis. O valor especial é interpretado como "leia o índice do buffer de quadros, adicione 0x8 e retorne". A última parte do truque é selecionar de maneira inteligente as próximas 8 cores na paleta.


A transparência não era usada frequentemente no jogo,


mas pode ser visto novamente durante o experimento,


quando um raio está prestes a se teletransportar Leicester para o Outro Mundo.






Três framebuffers


Dos três buffers de estrutura, dois são usados ​​para buffer duplo, enquanto o último é usado para preservar a composição de fundo (BKGD). Essa otimização evita redesenhar todos os polígonos de planos de fundo estáticos em favor de uma operação de cópia simples.


No próximo vídeo, veja como uma nova cena é desenhada primeiro no buffer BKGD. Cada novo quadro BKGD é completamente copiado para o buffer duplo. Lá elementos móveis, como o Leicester, são desenhados. Observe que, depois que o carro está "estacionado", ele também é desenhado no buffer BKGD para minimizar o número de polígonos que serão desenhados nos quadros subsequentes.



Observe também como a composição usa um algoritmo simples do artista , que, apesar de sua simplicidade, leva a um redesenho desnecessário. Isso não é um problema, pois é amplamente depreciado por uma cópia do BKGD.


Opcodes da máquina virtual


A tabela a seguir mostra 29 códigos de operação. Aqui você encontra opcodes para controle de fluxo (THRD), gerenciamento de buffer de quadros (FB) e todas as operações de gerenciamento de registros. A maioria das operações é "simples" de implementar, com exceção de COPY FB, FILL e DRAW_POLY *, que são complexos em termos de desempenho.




Os dois códigos de opção DRAW_POLY_ * abrangem mais de uma célula. DRAW_POLY_BACKGROUND ocupa metade do espaço do código de operação - de 0x80 a 0xFF . Muito desperdício, mas esse é um truque para economizar espaço. O uso de todas as operações iniciadas com o bit "1" permite que outros 7 bits sejam transferidos para o espaço do código de operação como parâmetros de renderização. Como esse opcode é usado para background e synomatics, economizar espaço é muito importante.


A versão SPRITE usa todos os códigos de operação começando com os bits "01", enquanto os 6 bits restantes são usados ​​para codificar coordenadas [x, y] e aplicar zoom para renderizar "sprites" de Leicester, amigo e inimigos.


O que vem a seguir?


Como mencionado anteriormente, 26 dos 29 códigos de operação são fáceis de implementar. O verdadeiro problema ao portar este jogo era manipular pixels dentro dos limites da largura de banda do barramento e do processador. Esta série discutirá como os buffers de quadros foram manipulados na porta e como os problemas dos códigos de operação DRAW, FILL e COPY foram resolvidos.

Source: https://habr.com/ru/post/pt482872/


All Articles