13/02/2020

O flickering charmoso do Street Fighter Alpha 2 para SNES

... Já perceberam que eu sou péssimo para dar títulos às postagens? ^_^


O flickering (algo como "tremedeira" em inglês) é uma técnica bastante usada em videogames antigos para criar a impressão de estar de exibindo mais elementos na tela do que o seus limites suportam. Em outras palavras, o hardware permite um número limitado de componentes na tela, e os programadores fazem com que alguns deles desapareçam por frações de segundo e façam com que outros sejam exibidos no mesmo instante, e depois trocam as suas posições, concatenando a exibição dos itens para criar uma ilusão de que todos estão sendo exibidos simultaneamente. Um dos exemplos mais famosos e antigos é o do jogo Adventure para Atari 2600, que permitia uma quantidade ínfima elementos ao mesmo tempo, mas nós imaginávamos muito mais:


Parece pouco, mas a técnica foi sendo aprimorada e logo recebemos jogos em que o flickering foi aplicado até mesmo em partes de sprites de inimigos e tiles dos cenários. Os exemplos são muitos e estão por quase todos os jogos da terceira geração de videogames (também chamada de "Era do processamento em 8-bits"), como Mega Man e Teenage Mutant Ninja Turtles - Arcade Game:

O NES te ajuda contra os ninjas: decepou o pé de um e desmembrou as pernas do outro!
O uso de flickering no Nintendo Entertainment System (também conhecido como NES ou "Nintendinho") surgiu por limitações de memória de sua PPU (Picture Processing Unit). Segundo o wiki Nesdev, a Unidade de Processamento de Imagem desenha 64 sprites por frame e 8 sprites por linha horizontal (as famosas scanlines). Sua memória para sprites (chamada de OAM - Object Attribute Memory) armazena-os em uma área de 256 bytes. Porém, existe uma OAM secundária com 32 bytes que guarda os sprites para scanline atual e a próxima. Se houver mais de 8 sprites por scanline, apenas os 8 primeiros serão exibidos. Para driblar isso, os desenvolvedores faziam com que os sprites excedentes alternassem cada um dos seus frames, o que causa o efeito de flickering registrado na screenshot acima e evita que eles não sejam exibidos em nenhum momento na tela.

Entretanto, o intuito da postagem é destacar o uso de flickering em um jogo de videogame lançado já em Novembro de 1996, época em que o PlayStation, Sega Saturn e Nintendo 64 já estavam no "pedaço". Como o título e a imagem em destaque já estão dedurando, Street Fighter Alpha 2 foi convertido com maestria para o Super Nintendo, apresentando uma qualidade bastante fiel à versão para fliperamas, mesmo com as diferenças notáveis de hardware. E para compreender todo o processo de desenvolvimento até o seu resultado, detalharemos as práticas utilizadas pela Capcom.

Todos os códigos funcionam também nessa versão, e os finais dos personagens refletem as mudanças!
A primeira solução foi o uso do chip S-DD1 (usado também em Star Ocean), que realiza a descompressão de sprites compactados em um total de 32 megabit (e não megabytes) através do "Algoritmo ABS Lossless Entropy" (codificação aritmética desenvolvida pela Ricoh). Os responsáveis pelo entendimento de como o chip funciona são os "cabeças" do emulador Snes9X, que inclusive consideraram desistir de entendê-lo e utilizar pacotes gráficos para simular o seu comportamento. O chip descompacta os sprites dinamicamente e os fornece diretamente para a PPU, e depois faz a mediação entre o microprocessador Ricoh 5A22 (também da Ricoh) e a memória ROM (somente de leitura, ou seja, com dados gravados de forma permanente) por dois barramentos. Com isso, o Ricoh 5A22 ainda pode solicitar sprites sem compactação mesmo que o chip S-DD1 já esteja ocupado com a descompressão, tudo ao mesmo tempo. Joia, não acham?

O problema é que há um efeito colateral: o jogo apresenta breves momentos de congelamento, principalmente entre a narração do round e o início da luta, devido a todo o processo envolvendo a descompressão de sprites para cada um dos rounds. Embora seja bastante evidente, não chega atrapalhar a experiência, e ainda é muito mais rápido (aproximadamente 3 segundos) do que o tempo de loading (carregamento de dados) de outras versões do jogo.

Entre o "Fight!" e a luta, o jogador precisa aguardar 3 segundos. Repare que as sombras sumiram durante a descompressão de sprites!
A Capcom também adaptou todo o visual ao console de 16 bits da Nintendo. Para tanto, os sprites foram redesenhados em proporção 8:3 (para serem esticados em 4:3) e suas animações foram simplificadas com menos quadros, visando tirar melhor proveito da resolução e das capacidades reduzidas do videogame. O resultado é muito superior ao alcançado nas conversões de Street Fighter 2 para o Super Nintendo, contando dessa vez com sprites maiores e mais detalhados:

As lâmpadas do caminhão foram redesenhadas para criar uma animação chamativa, mesmo com frames a menos!
Os cenários também foram refeitos, sempre tentando se assemelhar (e de forma impressionante) com suas versões originais: são muitas cores, elementos e efeitos visuais, mesmo que alguns tenham sido redesenhados e todas as animações fluídas deem lugar ao máximo de carisma que 2 ou 3 frames conseguem apresentar. A famosa abertura, que esbanja recursos aparentemente impossíveis de serem executados no Super Nintendo, está idêntica à original: todas as artes e animações que a tornaram memorável estão presentes, contando ainda com uma excelente adaptação da trilha sonora. Aliás, falaremos desse aspecto a seguir.

Disse uma vez: "Estou ABESTALHADO com sua beleza, inteligência, o brilho reluzente de suas pernas e o balanço dos seus quadris". Apanhei.
Para conseguir manter o essencial dentro do espaço de 4 megabytes (ou 31 megabites), todos os sons como vozes, golpes e interações no menu sofreram compressões. Porém, para a nossa surpresa, a maioria deles permanece audível, exceto por alguns golpes que já eram difíceis de entender nos fliperamas. Já as músicas tentam extrair o máximo de similaridade que o chip sonoro SPC700 é capaz de fazer, entregando um excelente resultado. Por último e não menos importante, as respostas aos comandos permanecem rápidas, e contamos ainda com 3 opções de velocidade: Normal, Turbo 1 e Turbo 2. E assim como em outros títulos de luta do Super Nintendo, o layout de 6 botões de ação de seu controle "se garante".

Mesmo com todos esses cuidados, o Super Nintendo ainda possui limites de hardware. No caso do Street Fighter Alpha 2, seria quase impossível desenhar a sombra de dois personagens simultaneamente, já que a quantidade de elementos na tela foi minuciosamente controlada para não ultrapassar o limite de 32 sprites por scanline e 128 sprites totais em tela. Mas a Capcom encontrou uma saída engenhosa: utilizou flickering, trocando a sombra do player 1 com a do player 2 em uma velocidade que cria uma ilusão de sombras transparentes para ambos os jogadores! As únicas formas de constatar o flickering é pausar o jogo ou tirar uma foto da tela, como essa:

Repare que apenas a sombra do Ken foi desenhada, enquanto a do Bison será exibida depois. Em movimento, cria-se uma ilusão perfeita!
Perdoem o excesso de informações, mas tive que percorrer todo esse caminho para explicar as razões que fizeram a Capcom recorrer ao flickering. Ou talvez eu seja apenas um tagarela infernal, prolixo e chato, e tenha feito a pior síntese de todos os tempos. Obviamente eu não me importo, mas quem concordar com a segunda hipótese será expulso do blog. Fica o aviso. Evidentemente estou brincando. Ou não. Depende do dia. Ou da hora. Sei lá. Bom, me xinguem nos comentários e digam o que acharam do texto :)

E é isso aí.

Nenhum comentário:

Postar um comentário