Minha experiencia com a emulação de jogos no Linux

Fala gente, tudo bem? Andei bem sumido nos últimos meses, mas aqui estou eu de novo! :smile:

Basicamente, criei esse tópico aqui para compartilhar com vocês minha experiência com a emulação de jogos no meu PC, como anda a jornada e se vale a pena ou não.

Deve ter uns 4 meses, mais ou menos, que decidi me aventurar nessa saga dos emuladores. Eu estive viajando bastante nesses últimos meses, o que me proporcionou alguns gaps de tempo livre que antes eram tediosos. Para resolver isso, simplesmente decidi baixar no meu celular um emulador de GBA para passar o tempo com jogos de qualidade. Como sou fã do Sonic há uns 10 anos, é claro que comecei por ele, com a trilogia Advance. Só nesses pequenos blocos de tempo livre, já estou quase zerando o Sonic Advance 1, sem nem parar para jogar oficialmente. Nesse caso, no celular (que é um Android), estou usando o emulador Pizza Boy A. Tem sido muito bom e o melhor: não tem anúncios.

Só que, com o tempo passando e conseguindo mais um tempinho livre, achei que os jogos de GBA, mesmo muito divertidos, eram um pouco limitados. Além disso, a experiência de jogar na tela do celular é um pouco ruim, principalmente pela falta dos botões traseiros (L/R). Então, foi aí que recorri ao meu fiel PC para rodar alguns jogos emulados. E é aí que a história começa.

Comecei tentando emular jogos de Wii no Dolphin, começando com Sonic Colors. A partir daí, engrenei pra valer: emulador a emulador, jogo a jogo. Hoje, estou emulando 48 jogos, entre títulos retrô e outros bem modernos. Aqui vai uma análise da minha experiência pessoal com cada um dos emuladores que utilizo:

Os emuladores

  • Azahar (3DS): É um excelente emulador. A compatibilidade com os jogos é ótima, tem excelente suporte a texturas personalizadas e alto desempenho. Só acontece, às vezes, de dar um congelamento no próprio emulador ao abrir um jogo; basta fechá-lo e abrir novamente que o problema some.
  • Cemu (Wii U): No quesito “ser um emulador”, esse aqui ganha disparado. Ele é excelente, extremamente polido, muito performático, roda jogos bem pesados de forma fluida e é extremamente estável. A interface é limpa e intuitiva.
  • Dolphin (Wii/GameCube): Um ótimo emulador, porém enfrento dois problemas chatos com diferentes soluções. O primeiro é a emulação de seus respectivos controles. Isso não é culpa do software, mas sim dos consoles que ele emula. Emular os movimentos de um Wii Remote no meu controle de PC (que não tem sensor de movimento) acaba sendo uma experiência bem frustrante. O botão Z do GameCube também não existe fisicamente no meu controle, o que me forçou a fazer uma gambiarra para ativar o poder dos Wisps, por exemplo, mapeando o Z para o botão Home. O segundo problema é a perda de foco. Quando a janela do Dolphin perde o foco no KDE Plasma, o controle simplesmente para de funcionar dentro do jogo, o que é bem irritante. Por incrível que pareça, esse problema não acontece no GNOME; onde testei, ocorre apenas no Cinnamon e no KDE Plasma.
  • BSNES (Super Nintendo): Excelente emulador, bem fiel, os jogos rodam lindos. De tão bom que é e por cumprir tão bem o que promete, não tem nem mais o que falar, kkk.
  • Mednafen (no meu caso, apenas para NGPC): Eita, esse deu treta. Eu queria MUITO jogar Sonic Pocket Adventure, um jogo do ouriço que é desconhecido pela maioria, mas que é incrível. Ele serve como uma releitura de Sonic 2, só que no Neo Geo Pocket Color e com os sprites do Sonic Moderno — ou seja, um jogo muito bonitinho e divertido. Para isso, eu precisava de um emulador de NGPC, e esse foi o mais fácil de achar. O problema? Não reconheceu meu controle de jeito nenhum. Precisei usar o AntiMicroX e ainda fazer uma gambiarra gigante para o áudio funcionar… Se alguém quiser rodar o mesmo jogo e encontrar o mesmo problema, aqui está o script que utilizo para executar o game:
#!/bin/bash

# Caminho para o jogo do NGPC
JOGO="/home/henrique/Games/NGPC/Sonic The Hedgehog - Pocket Adventure (World) (En,Ja).ngc"

# Caminho para o perfil do AntiMicroX
PERFIL="/home/henrique/Games/NGPC/sonic.gamecontroller.amgp"

# Caminho ABSOLUTO para o executável do Mednafen (runner do Lutris).
# Precisa ser absoluto: com "./mednafen" o script só funcionava se fosse
# executado a partir daquele diretório.
MEDNAFEN_BIN="/home/henrique/.var/app/net.lutris.Lutris/data/lutris/runners/mednafen/bin/mednafen"

# --- ÁUDIO ---------------------------------------------------------------
# O Mednafen usa a lib SexyAL, que por padrão ("sound.driver default")
# abre a placa de som via ALSA DIRETAMENTE. Isso "rouba" o dispositivo do
# PipeWire: o sink real (alsa_output.pci-...) some e o GNOME passa a
# mostrar "Saída de falsa" (auto_null). Como o áudio do jogo deixa de
# passar pelo PipeWire, o volume do GNOME também deixa de valer -> o som
# fica muito baixo.
# Com "sound.driver sdl" (em ~/.mednafen/mednafen.cfg) o áudio é entregue
# ao PipeWire/PulseAudio. Aqui só garantimos que o SDL nunca caia no
# driver ALSA direto.
export SDL_AUDIODRIVER="${SDL_AUDIODRIVER:-pulseaudio}"
# -------------------------------------------------------------------------

# Estamos dentro do Flatpak (Lutris)? O flatpak-spawn existe no runtime
# do Flatpak e permite alcançar o host. Fora dele (terminal normal) o
# comando é executado localmente.
HAVE_FLATPAK_SPAWN=0
command -v flatpak-spawn >/dev/null 2>&1 && HAVE_FLATPAK_SPAWN=1

# Executa um comando no host
exec_host() {
    if [ "$HAVE_FLATPAK_SPAWN" = "1" ]; then
        flatpak-spawn --host "$@"
    else
        "$@"
    fi
}

ANTIMICRO_PID=""

cleanup() {
    if [ -n "$ANTIMICRO_PID" ]; then
        kill "$ANTIMICRO_PID" 2>/dev/null
    fi
    # O flatpak-spawn deixa o processo do AntiMicroX órfão no host, então
    # encerra também pelo perfil (apenas o deste jogo, não outros).
    exec_host pkill -f "antimicrox.*${PERFIL##*/}" 2>/dev/null
}

trap cleanup EXIT INT TERM

# 0. Se o PipeWire ficou preso na "Saída falsa" (auto_null) -- o que
# acontece quando algum programa abre a placa de som direto --, reinicia o
# WirePlumber para restaurar a saída real.
if [ "$(pactl get-default-sink 2>/dev/null)" = "auto_null" ]; then
    echo "[run.sh] Saída falsa detectada, restaurando o PipeWire..."
    exec_host systemctl --user restart wireplumber
    sleep 2
fi

# 1. Abre o AntiMicroX NO HOST em segundo plano.
# Ele precisa do host: usa /dev/uinput (para o gamepad virtual) e o portal
# do desktop.
exec_host antimicrox --hidden --profile "$PERFIL" &

# Salva o PID do processo AntiMicroX iniciado
ANTIMICRO_PID=$!

# Aguarda 1 segundo para o AntiMicroX carregar o perfil
sleep 1

# 2. Executa o jogo no Mednafen.
# Força o driver SDL para não abrir ALSA direto e evitar criar o sink "auto_null"
export SDL_AUDIODRIVER="${SDL_AUDIODRIVER:-pipewire}"
"$MEDNAFEN_BIN" -sound.driver sdl "$JOGO"
EXIT_CODE=$?

# 3. Assim que o Mednafen for fechado, encerra o AntiMicroX
cleanup
ANTIMICRO_PID=""

exit $EXIT_CODE

*Use o código com cuidado.

  • melonDS (DS): Outro emulador excelente que simplesmente cumpre o que promete sem dores de cabeça. Não tem muito o que estender.
  • mGBA (GBA): O que eu uso para rodar os jogos de Game Boy Advance no PC. Outro software perfeito, e os saves funcionam perfeitamente entre ele e o Pizza Boy do celular.
  • Kega Fusion (Mega Drive): Bem parecido com o BSNES ao meu ver, exelente tbm, msm em 32bits.
  • Redream (Dreamcast): Excelente também. Uso para rodar Sonic Adventure 1 e 2. Muito funcional, roda tudo lindo e não tenho nada a reclamar.
  • Ryujinx (Nintendo Switch): Aqui entramos em uma fase da emulação que exige consideravelmente mais hardware. É um emulador que demanda bastante ação do usuário; você precisa gerenciá-lo de perto para poder jogar com tranquilidade, e ele ainda mantém aquele aspecto de software em estado beta. Como estudo desenvolvimento de sistemas há um tempo, já tenho um pouco de experiência analisando softwares e sinto que ainda falta um caminho para o Ryubing (o fork q continua o desenvolvimento do Ryujinx) atingir seu potencial máximo — quem sabe, um dia, chegar ao nível de polimento do Cemu.

Tá, mas como é a experiência da emulação em geral?

Uma resposta simples? Boa, mas que exige um pouco mais de configurações e otimizações do que simplesmente baixar e jogar um jogo nativo. O ponto positivo disso é que você vai aprender bastante coisa que não sabia, além de deixar uma sensação de recompensa incrível ao conseguir rodar um jogo que foi difícil de configurar.

Além disso, a emulação abre muitas portas para novos jogos que não possuem versão oficial para PC. Por questões legais, eu não vou falar para vocês onde e como consigo os jogos, até porque a emulação em si é completamente legal.

Sendo assim, e a infraestrutura pra isso?

Eu centralizo tudo no bom e velho Lutris. Ele funciona muito bem com a maioria desses emuladores, é extremamente simples, fácil e sem frescuras.

Quais tipos de jogos eu rodo?

Principalmente jogos de plataforma. Dos meus 49 jogos, 22 são do nosso querido blue blur (Sonic). Mas também rodo jogos do Mario, Kirby, Dragon Ball, alguns outros títulos únicos e alguns indies. Meu gosto principal mesmo são os jogos de plataforma, o que facilita demais, pois em sua maioria são bem mais leves que outros estilos, dando uma ajuda enorme no desempenho.

Hardware

E qual hardware eu tenho para rodar todos esses jogos? Basicamente, um laptop da Asus (modelo X515EA), com um processador i5-1135G7, gráficos integrados Intel Iris Xe, 8 GiB de RAM e um SSD NVMe de 500 GB.

Otimizações e OS

Aqui está o que determinou a salvação do meu hardware para os jogos mais pesados (Wii U e Switch). Atualmente estou usando o CachyOS, mas não foi ele sozinho que fez milagre não. Eu já rodei esses mesmos jogos tanto no Arch puro quanto no Linux Mint, e funcionaram bem também. Oq realmente ajuda demais e a zram, q evita o oom killer fechar meu emulador, e deixa o sistema fluido e completamente funcional, msm com jogos mais pesados abertos. Eu uso a zram com o mesmo tamanho da ram, não recomendo usar mais q isso.

E vocês, também usam emuladores? Quais são os preferidos de vocês e qual foi a maior gambiarra que já tiveram que fazer para um jogo rodar? Comentem aí!

2 curtidas