Porque é que os emuladores são lentos?
Em grande parte, porque o emulador é um software que tenta fingir ser hardware. Em hardware, tudo acontece a cada ciclo do relógio. Massivamente paralelo. Em software, você pode fazer algumas coisas paralelas, mas onde uma coisa depende da outra, as coisas têm de ser feitas em sequência. E você tem que usar esse software para simular o que algum outro hardware está fazendo.
Take, por exemplo, como funciona um Intel 4004 antigo. Para uma emulação digital pura realmente precisa, você deve simular 2.300 transistores individuais e como eles estão conectados uns aos outros. Fazê-lo a esse nível vai ser muito lento. (Não me faça começar com a modelagem SPICE do layout do circuito).
Você pode pegar atalhos para melhorar a velocidade, mas fazer isso é à custa da precisão. Se você tem um software projetado para uma peça específica de hardware, e agora que o hardware está sendo emulado, tudo o que é impreciso sobre o hardware acabará sendo feito de forma imprecisa nesse software - veja, por exemplo, o ZSNES (antigamente o "padrão" para emulação SNES, agora largamente ignorado, exceto para as ROMs moduladas) muitas vezes não fazia a transparência corretamente; o antigo emulador NESticle não fazia o buffer de scroll corretamente e tinha que ter duas correções de hack diferentes para fazer funcionar, mas essas correções quebravam outras coisas, então elas tinham que ser trocadas.
Back to the 4004, você pode pegar o atalho de ao invés de emulá-lo no nível do transistor, você o emula no nível do subsistema.
(Por Appaloosa, adicionado à Wikipedia[1])
Ok então agora nós podemos emular cada peça individual disto. A maior parte disto é uma lógica bastante simples e não requer muito código por bloco; está tudo na forma como você conecta os blocos em código. Neste ponto é tudo em fluxo de dados, então você terá que inventar como isso conecta as peças.
No hardware, cada um desses blocos está cuspindo algo a cada ciclo do relógio. No software, você está limitado por quantas coisas a sua CPU pode fazer ao mesmo tempo.
Hmm... talvez haja algo mais que você possa fazer para conseguir isso mais rápido e ao mesmo tempo ser razoavelmente preciso?
Que tal apenas olhar para o conjunto de instruções e decidir como interpretar cada instrução no seu próprio sistema?
Problema é que provavelmente existem muitas estruturas que são diferentes ou inexistentes no seu sistema, por isso terá de inventar como ligar algo que funcionará razoavelmente de forma semelhante, o que terá um mau desempenho.
Também, traduzir cada instrução não é grátis. Há um custo para isso - procure instruções, função de chamada (e atualizações de funções na memória emulada).
Viragem há maneiras de acelerar isso também, ao custo de um breve momento de pausa para fazer uma quantidade maior de montagem/compilação do que está vindo da ROM.
Mas, no geral, é preciso muito overhead para emular hardware com software, ao ponto de, a menos que haja algum molho mágico secreto de compatibilidade, seu sistema emulador precisar ser pelo menos 10x mais potente que o seu sistema emulado.
Notas de rodapé
[1] Intel 4004 - WikipediaArtigos semelhantes
- Como é que os emuladores de consolas Nintendo estão mais avançados do que os emuladores PS/Xbox?
- Os emuladores usam uma GPU dedicada? Os jogos em emuladores usam GPU?
- O que são bons jogos de FPS que não são "baseados em contracções" e são melhores para pessoas mais velhas com reflexos mais lentos?
- Porque é que 120fps e 240fps são considerados lentos?