PortMaster
Rodando ports nativos de jogos no R36S
O PortMaster é um catálogo de ports de jogos feitos para portáteis como este: reimplementações de engines em código aberto, jogos em Godot e Love2D, e binários de PC empacotados para rodar em ARM. Ele já vem instalado.
Ports não são emulação. Cada um é um programa de verdade rodando no console, então o que funciona e o quanto funciona se decide port a port.
Como abrir
EmulationStation → Tools → Start PortMaster.
A primeira execução descompacta o PortMaster em /storage/roms/ports/PortMaster/ e copia as peças que o ArchR mantém: control.txt, mapper.txt, mod_ArchR.txt e o banco de dados de controles. Ela também esconde a pasta PortMaster da lista de jogos de Ports, para você ver os seus ports e não as entranhas dele.
Daí em diante é a interface do próprio PortMaster. Navegue, instale, e o port aparece como um lançador .sh no sistema Ports, ao lado de uma pasta com os arquivos dele.
Se Ports ainda não está na tela inicial, é porque está vazio. Ele aparece assim que você instalar alguma coisa, ou de imediato se você ligar Show empty systems em Game Collection Settings.
O que o ArchR oferece para os ports
| Peça | Para que serve |
|---|---|
box86, box64 | Rodar binários x86 e x86_64 em ARM |
Bibliotecas de 32 bits em /usr/lib32 | O lado de 32 bits que os ports com box86 precisam |
/usr/lib/compat | Versões antigas de bibliotecas que ports feitos para Debian esperam |
gptokeyb | Transforma entrada de joypad em eventos de teclado e mouse |
oga_controls | O auxiliar de input mais antigo, para ports que ainda o chamam |
Python 3 com lzma | Usado pela interface do PortMaster e por vários ports |
mod_ArchR.txt | Lido pelo PortMaster, define os caminhos de biblioteca e as opções de tela deste sistema |
O /dev/uinput fica com permissão de escrita para todos por uma regra de udev, e é isso que permite ao gptokeyb criar o teclado virtual dele.
O mapeamento de controle que um port enxerga é gerado a partir da sua configuração do EmulationStation pelo mapper.txt no momento do lançamento, então o port herda o mesmo ajuste de controle que o resto do sistema usa.
Rodando um port
Selecione o lançador em Ports e aperte A, igual a um jogo. O que acontece em volta:
- Syncthing, Tailscale, ZeroTier e o servidor de compartilhamento de arquivos são parados durante a partida, e só os que estavam rodando voltam a subir depois.
- O agente de Bluetooth é parado e reiniciado.
- O compartilhamento de páginas iguais do kernel é pausado, porque num Cortex-A35 ele aparece como picos no tempo de quadro.
- O governador da CPU vai para performance e a GPU é fixada na frequência mais alta.
- O port roda com prioridade alta.
Sair é assunto do port, não do sistema. A maioria usa START segurado ou alguma combinação descrita na própria página do port. L1 + SELECT + START encerra à força qualquer coisa que não feche sozinha.
Ports que precisam do jogo original
Boa parte dos ports é só a engine, e você fornece os arquivos de dados a partir de uma cópia que possui. O PortMaster informa quais arquivos faltam e onde eles vão, port a port. Coloque-os em /storage/roms/ports/<port>/ por SSH ou Samba.
Desempenho
O RK3326 tem quatro núcleos Cortex-A35 e uma Mali-G31. É um chip lento por projeto, e a diferença entre as categorias é grande:
- Ports compilados nativamente para ARM rodam melhor. A maioria dos jogos em Godot, Love2D e SDL do catálogo está nesse grupo.
- Ports que passam por box86 ou box64 pagam o custo da tradução por cima. Alguns ficam bons, outros não, e as notas do próprio port valem mais que qualquer regra geral.
- Qualquer coisa que espere uma GPU dedicada não vai funcionar aqui.
O PortMaster marca cada port com o hardware em que ele é conhecido por rodar. Esse rótulo vale mais que um palpite tirado das especificações.
Se um port está quase lá, System Settings → Enable CPU Overclock libera o ponto de operação de 1512 MHz. Sem ele a CPU para em 1416 MHz. Vem desligado, custa bateria e calor, e é respeitado durante a partida em vez de ser forçado sempre.
O mesmo menu tem Default GPU scaling governor, se você quiser a GPU fixada também fora dos jogos.
Quando dá errado
O port abre numa tela preta e nada acontece. Leia o /var/log/exec.log, que guarda a saída do último lançamento. A maioria das telas pretas é um arquivo de dados que falta ou uma biblioteca ausente, e o log diz qual.
Os controles não fazem nada. O port provavelmente está esperando o gptokeyb. Confira se o /dev/uinput existe e tem permissão de escrita (ls -l /dev/uinput).
O port reclama da versão de uma biblioteca. Ele foi compilado contra algo mais novo do que existe em /usr/lib/compat. Reporte para quem mantém o port pela comunidade do PortMaster, porque a correção é do lado do port.
O PortMaster não abre. Rode /usr/bin/start_portmaster.sh por SSH e leia o que ele escreve. O script pode ser rodado de novo sem problema, ele recopia os arquivos toda vez.
Um port que você apagou continua na lista. O EmulationStation guarda a lista de jogos em cache. Game Collection Settings → Update gamelists, ou reinicie a interface.
Onde ficam as coisas
/storage/roms/ports/
├── PortMaster/ a interface e os auxiliares dela, escondida na lista de jogos
├── <NomeDoPort>.sh o lançador que você vê no ES
├── <NomeDoPort>/ os arquivos do próprio port
└── gamelist.xml
/storage/.config/PortMaster/
├── control.txt caminhos e perfil do aparelho, lido por todo port
├── mapper.txt monta o mapeamento de controle no lançamento
├── mod_ArchR.txt os ganchos específicos do sistema
└── gamecontrollerdb.txtPara remover um port, apague o .sh e a pasta dele, depois atualize as listas de jogos.