Como jogar Super Mario Bros Online direto no navegador
Você já tentou rodar Super Mario Bros em versão online e deparou com lag insuportável ou um servidor que simplesmente sai do ar na hora da partida? Eu passei por isso. O problema é que a maioria dos sites que prometem o clássico em multiplayer roda em JavaScript puro sem nenhum tipo de otimização de rede, e quando mais de duas pessoas juntam, o frame drop aparece rápido. O que funciona de verdade é usar versões que implementam rollback netcode ou pelo menos um sistema de input delay compensado. O Super Mario Bros original tem 60 frames por segundo fixo, então qualquer lacuna de sincronia entre os clientes se traduz em uma diferença visível de posição a cada dois segundos. Meu caso específico foi num site onde o segundo jogador aparecia 8 frames atrás do principal, e eu descobri isso comparando o estado do mapa frame a frame. A solução foi desabilitar a animação de transição entre telas nas configurações do emulator e forçar o sync via WebSocket manual.
Super Mario Bros Online: o que realmente existe
A versão online não é o jogo original da Nintendo — é um emulator rodando ROMs com camadas adicionais de sincronização. O mais comum é usar o jsnes ou -emulator como base, e adicionar um servidor WebSocket que replica o estado do jogo entre os jogadores. Cada input (seta, botão A, botão B) é enviado como um evento serializado com timestamp, e o cliente receptor replaya os inputs no mesmo ciclo de frame. O problema principal é que Mario Bros roda em 60fps, então você precisa sincronizar inputs a cada 16,67 milissegundos. Se a latência de rede ultrapassar 50ms, o jogo já fica jogável apenas para partidas casuais. Para competições, idealmente fica abaixo de 30ms. Isso explica por que servidores europeus sofrem mais quando jogadores nos EUA tentam conectar — a distância física cria latência inevitável.
Existem basicamente três abordagens no mercado. A primeira é hot-seat, onde dois jogadores compartilham o mesmo teclado — simples, sem rede, mas limitado a uma máquina. A segunda é emulator compartilhado via streaming, como usar emulators que rodam no servidor e transmitem vídeo — funciona mas consome banda (cerca de 5-10 Mbps por conexão). A terceira, e mais eficiente, é input synchronization pura, onde só os inputs trafegam, não o vídeo — isso reduz a necessidade de banda para menos de 100 Kbps, mas exige que ambos os lados tenham a mesma ROM e a mesma versão do emulator. Uma coisa que iniciantes nunca percebem: o Super Mario Bros original usa nmi handler para sincronização de frame, e qualquer emulator que não replica exatamente esse timing vai gerar diferenças comportamentais. Eu já vi versões online onde o sprite de Mario pulava 2 pixels mais alto porque o emulator usava un cycle-accurate timing diferente. O workaround foi trocar para a build do Nestopia UE com flag de cycle accuracy habilitada.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Counter-intuitivo: mais frames não significa melhor experiência online. Na verdade, rodar em 30fps com rollback netcode funciona melhor do que 60fps sem compensação de lag. O Super Mario Bros foi feito para 60fps, mas em contexto online, 30fps com input buffering de 2 frames é mais estável do que tentar manter 60fps sincronizado via UDP sem perda de pacotes.
Tutoriais e links de acesso
A forma mais acessível de jogar atualmente é através de plataformas como o mario.online ou mirrorings no GitHub que usam o código open source do jsnes com camada de multiplayer. Eu recomendo o projeto smb-online no GitHub — ele implementa handshake de conexão via WebRTC, o que evita a necessidade de servidores dedicados para pequenas partidas (até 4 jogadores). Para mais de 4, ai sim precisa de um servidor VPS com latência baixa. Se você quer Rodar localmente, o processo leva cerca de 10 minutos. Baixa o código fonte, instala dependências com npm install, e roda o servidor local. A ROM precisa ser fornecida pelo usuário — isso é importante porque distribuir a ROM seria violação de direitos autorais. O emulator carrega a ROM a partir de um arquivo local, então você precisa ter uma cópia legítima.
Dica prática: se o jogo travou num frame específico depois de 15 minutos de partida, quase certamente é um race condition no sync de inputs. O fix é reiniciar a conexão e garantir que ambos os clientes usam a mesma versão do emulator — eu já perdi horas caçando bugs que eram simplesmente versões diferentes do jsnes em cada ponta. Limitações sérias que ninguém fala: esses jogos online não suportam save state sincronizado. Você não pode salvar o progresso e continuar de onde parou — cada sessão é independente. Isso significa que partidas longas de speedrun ou completionismo não são viáveis nesse formato. O único workaround é gravar vídeo ou usar screen capture externo.
Também vale mencionar que a maioria dos servidores públicos cai em horários de pico. Eu recomendo montar sua própria instância local se pretende jogar regularmente — o custo é zero se você já tem um PC razoável, e a latência fica abaixo de 5ms (loopback). Para jogar remotamente com amigos, considere usar um tunnel VPN como Tailscale antes de conectar aos emulators, isso elimina a necessidade de expor portas no router. O timing do Mario Bros é rigidamente determinístico, o que é ao mesmo tempo uma vantagem e uma desvantagem. Vantagem porque permite replay exato de inputs. Desvantagem porque qualquer divergência mínima no emulator — diferença de floating point, ordem de operações, até versão do sistema operacional — gera estados diferentes a longo prazo. Por isso, manter todos os jogadores na mesma versão do emulator não é recommendation, é requisito.