terça-feira, 13 de fevereiro de 2018

Precisão Demanda Poder (Parte 2)

Precisão Demanda Poder: A Saga de 3GHz de Um Homem para Construir o Emulador Perfeito de SNES (II)

Precisão Demanda Poder: A Saga de 3GHz de Um Homem para Construir o Emulador Perfeito de SNES (II)

1 Um Emulador para Todo Jogo

É possível prever um dia ruim no futuro quando um usuário final precisar do ZSNES v1.42 para uma lista de quatro traduções, SNES9x v1.51 para outros seis ROM Hacks, e bsnes v080 para algum jogo japonês obscuro. Isto acaba sendo oneroso.

Você tem que entender que emuladores, também, têm seus tempos de mostruário. Isto é especialmente verdadeiro para aqueles como o ZSNES que são escritos em puro assembly x86. Você simplesmente não consegue rodá-lo em seu celular. Travando um hack para rodar somente no ZSNES, você está destinando-o à irrelevância. Assim que o Windows eliminar a compatibildade retroativa no 32-bit, assim como ele já fez com o 16-bit, estas traduções e hacks de fãs serão perdidas para sempre. Neste ponto o emulador em si se torna quase como outro console morto, em vez de uma forma para manter os velhos jogos ainda vivos.

E tem toda aquela coisa chata de que jogos SNES deveriam rodar, bem, você sabe, num console SNES real. Criando emuladores que imitam o hardware perfeitamente, oi tão próximo quanto se possa chegar, nós criamos uma plataforma que pode rodar em múltiplos sistemas, e permitimos jogos e hacks que rodem em futuras versões. A ideia é manter os specs do hardware SNES vivos, não apenas a ideia dos jogos.

2 Mas Sério, 3GHz? Cê tá brincando?

É possível para um emulador SNES bem otimizado voltado à velocidade rodar em velocidade máxima usando somente 300MHz de poder de processamento. Você acabará também com centenas de bugs obscuros.

O que tipicamente acontece é que os problemas são especificamente contornados. Tanto ZSNES quanto Snes9x contêm listas internas de uns 50 jogos mais populares. Quando você carrega estes jogos, os emuladores ajustam seus valores de temporamento e consertam certas áreas de código para fazer estes jogos rodarem. É uma melhoria sobre os tempos do Nesticle onde os jogos eram hackados externamente, mas isto ainda é trapacear, não importando o resultado visual final.

O jogador casual que só joga os 20 jogos mais famosos não verá diferenças visíveis entre um emulador requerindo 300MHz e outro requerindo 3GHz, então obviamente ele ficará com o primeiro. Apesar de eu seriamente respeitar e apreciar emuladores voltados à velocidade, açguém preocupado com precisão nada pode além de lamentar a forma que isto trava o progresso. Sem mais jogadores usando os emuladores mais precisos, nós não encontraremos os bugs em todos os jogos que o emulador suporta. Quanto mais pessoas temos jogando os jogos da forma que eles foram intencionados, melhor os emuladores podem se tornar dado que problemas são encontrados e eliminados - não consertando cpodigo específico para cada jogo, mas consertando a precisão do emulador.

A captura de tela abaixo é um grande exemplo de um jogo de nicho. É na realidade um bom jogo de plataforma, mas poucas pessoas ouviram dele falar. É um grande exemplo de porque ainda que os jogos mais populares possam rodar decentemente com emuladores imprecisos, ainda assim precisão importa. Você nunca saberá quando aquele seu jogo favorito um-pouco-menos-comum pode acabar caindo num bug desses. Nas capturas abaixo, você vê um interruptor. Quando este interruptor é acionado em qualquer outro emulador, o jogo trava instantaneamente. O que deveria acontecer é demonstrado nas capturas seguintes: o interruptor move o bloco no meio do campo elétrico. É necessário que isto seja feito para completar o nível e, por conseguinte, o jogo. No nomento deste escrito, bsnes é o único emulador de SNES capaz de jogar completamente este jogo.

O SNES tem não somente um modo de exibição de alta resolução, mas uma variante chamada "pseudo-hires". Este modo é útil para criar um verdadeiro alpha-blending entre as camadas no hardware do SNES. Ignorar este modo resulta em camadas obstruindo outras completamente, como vemos na imagem abaixo.

Video games são uma peça da nossa história, e nós precisamos respeitar o fato de que existe uma forma verdadeira na qual eles foram lançados. Imagine se tivéssemos somente um JPEG de MonaLisa, uma stream RealVideo da aterrissagem na lua, ou uma rendição MIDI de "Walkin in the Air". Nós temos a capacidade de manter o nosso passado vivo, e eu sinto que é quase um dever fazê-lo.

3 Então para Onde Os 2.7GHz Vão? Sincronização

O erro de conceito mais comum em estimar o desempenho de um emulador é que você pode simplesmente observar a taxa de clock do processador primário. Infelizmente, isto realmente não te diz nada. A CPU do Nintendo 64 pode ser clockada em 35 vezes a CPU do SNES, e ainda assim o UltraHLE requer o mesmo poder de processamento que o ZSNES.

As demandas primárias de um emulador são o total de vezes por segundo que um processador deve sincronizar com outro. Um emulador é um processo inerentemente serial. Tentar se apoiar nos processadores multicore de hoje em dia leva a toda espécie de problemas de temporização. Pegue a analogia da linha de montagem: uma pessoa descarrega as caixas, a outra passa o scan nelas, a outra abre, a outra começa a colocar os itens juntos etc. Sincronização é o equivalente de obstruir e limpar completamente a linha, e então iniciar um novo produto. Isto é um incrível golpe no fluxo. Ele anula completamente os efeitos do pipeline e da execução fora de ordem. Quanto mais você tem que sincronizar, mais rápido sua linha de montagem tem que se mover para prosseguir.

Vamos comparar as razões de sincronização entre o ZSNES e o bsnes:

Table 1: DADOS COMPARATIVOS
Componente ZSNES bsnes
S-CPU 600.000 21.477.272
S-SMP 256.000 24.576.000
S-DSP 032.000 24.576.000
S-PPU 015.720 21.477.272
Total 903.720 92.106.544

Vamos começar com a CPU, que tipicamente é assumida como rodando a 3.58MHz. Esta taxa aplica-se ao número de ciclos executados por segundo. Uma instrução típica pode consumir de quatro a oito ciclos, e ZSNES sincroniza uma vez por instrução. Mas para ficar ainda mais técnico, ciclos são quebrados em delays de barramento que requerem temporização no nível bruto do oscilador. A CPU do SNES está clockada em 21.47MHz. O mesmo se aplica ao SMP, cujo oscilador está clockado em 24.58MHz.

Quando chegamos ao vídeo, 99% dos jogos não tentam modificar os registradores de exibição enquanto se está montando a tela. Isto permite que scanlines inteiras sejam traçadas de uma vez, requerendo 262 scanlines X 60 frames por segundo de sincronização. Mas rode um jogo como Air Strike Patrol, que escreve no registrador de brilho múltiplas vezes por scanline, e você terá que sincronizar em cada ciclo de clock se quiser precisão perfeita.

Quando chegamos ao áudio, virtualmente todos os títulos rodarão bem se você apenas sincronizar pela taxa de áudio para casar a frequência de 32kHz do SNES. Mesmo assim, rode um título como Earthworm Jim 2 e você verá que os efeitos de som irão se perder se não sincronizar por ciclo. koushien 2 pode até mesmo travar periodicamente.

Então, apesar de bsnes rodar dez vezes mais lentamente que ZSNES, ele é literalmente umas cem vezes mais preciso. Na verdade, é de fato bastante impressionante que isto seja possível em meros 3GHz. Somente porque eu tenho utilizado multithreading cooperativo e sincronização just-in-time, técnicas que eu nunca vi antes usadas em emulação, eu consegui melhorar o desempenho que o bsnes atualmente tem. Máquinas de estados, que dirá agendamento de kernel, simplesmente não servem para a tarefa.

A observação mais imediata é o fato que mesmo em um centésimo da taxa de sincronização, ZSNES ainda roda bem a maior parte dos jogos. Não há por que negar, sincronização perfeita absoluta raramente é requerida. Mas o fato é, há casos em que ela é necessária. Sendo a CPU do SNES lenta como é, muitos jogos originais levam o sistema aos seus absolutos limites.

Se você não calcular o tempo perfeitamente, acabará em um eterno jogo de bate-na-toupeira. Conserte um jogo para quebrar outros dois, conserte-os e quebre mais dois. Conserte-os para quebrar o jogo inicial de novo. Você só precisa olhar os changelogs dos últimos quinze anos para verificar isto.

4 META

Table 2: META
Título Original Accuracy takes power: one man's 3GHz quest to build a perfect SNES emulator
Autor byuu
Link Original http://arstechnica.com/gaming/2011/08/accuracy-takes-power-one-mans-3ghz-quest-to-build-a-perfect-snes-emulator/2
Link Arquivado http://archive.is/lXA7Y

Created: 2018-03-24 sáb 20:06

Validate

Nenhum comentário:

Postar um comentário

Entendendo o Combinador Y [hishamhm]

Entendendo, Finalmente, o Combinador Y - Uma Abordagem de uma Perspectiva Amigável a Programadores Entendendo, Finalmente, o...