Foram lançadas as versões dos emuladores Box86 0.2.6 e Box64 0.1.8, projetadas para executar programas Linux compilados para arquiteturas x86 e x86_64 em hardware com processadores ARM, ARM64, PPC64LE e RISC-V. Os projetos são desenvolvidos de forma sincronizada por uma única equipe de desenvolvedores — Box86 limita-se à execução de aplicativos x86 de 32 bits, enquanto Box64 garante a execução de arquivos executáveis de 64 bits. O projeto se concentra fortemente na implementação de aplicativos de jogos, incluindo a capacidade de rodar compilações do Windows através do wine e Proton. Os códigos-fonte do projeto estão escritos em C e são distribuídos (Box86, Box64) sob a licença MIT.
Uma característica do projeto é a utilização de um modelo híbrido de execução, onde a emulação é aplicada apenas ao código de máquina do próprio aplicativo e a bibliotecas específicas. Bibliotecas de sistema típicas, incluindo libc, libm, GTK, SDL, Vulkan e OpenGL, são substituídas por variações nativas das plataformas de destino. Assim, as chamadas de biblioteca são executadas sem emulação, o que resulta em um aumento significativo de desempenho.
A emulação de código, para a qual não há substituições nativas na plataforma de destino, é realizada utilizando a técnica de recompilação dinâmica (DynaRec) de um conjunto de instruções de máquina para outro. Em comparação com a interpretação de instruções de máquina, a recompilação dinâmica demonstra desempenho de 5 a 10 vezes superior.
Nos testes de desempenho, os emuladores Box86 e Box64, ao serem executados em plataformas Armhf e Aarch64, superaram consideravelmente os projetos QEMU e FEX-emu, e em testes específicos (glmark2, openarena) alcançaram desempenho equivalente ao da execução de uma compilação nativa para a plataforma de destino. Nos testes do 7-zip e dav1d, que realizam cálculos intensivos, o desempenho do Box64 variou entre 27% e 53% do desempenho do aplicativo nativo (para comparação, o QEMU obteve resultados de 5-16%, enquanto o FEX-emu ficou entre 13-26%). Além disso, foi realizada uma comparação com o emulador Rosetta 2, utilizado pela Apple para executar código x86 em sistemas com chip ARM M1. O Rosetta 2 alcançou um desempenho de 71% em um teste da base do 7zip em relação à compilação nativa, enquanto o Box64 alcançou 57%.

Em termos de compatibilidade com aplicativos, de 165 jogos testados, cerca de 70% funcionaram com sucesso. Aproximadamente 10% funcionam, mas com algumas ressalvas e limitações. Entre os jogos suportados estão WorldOfGoo, Airline Tycoon Deluxe, FTL, Undertale, A Risk of Rain, Cook Serve Delicious e a maioria dos jogos da empresa GameMaker. Entre os jogos que apresentam problemas, destacam-se os que usam o motor Unity3D, que depende do pacote Mono, cuja emulação nem sempre funciona devido ao uso da compilação JIT no Mono, além das altas exigências gráficas que nem sempre são atendidas em placas ARM. A substituição das bibliotecas de aplicativos GTK ainda está limitada ao GTK2 (a substituição do GTK3/4 não está totalmente implementada).
Principais mudanças nas novas versões:
- Adicionada a interface para a biblioteca Vulkan. Suporte ao API gráfico Vulkan e DXVK (implementação do DXGI, Direct3D 9, 10 e 11 sobre Vulkan) foi adicionado.
- Melhorias nas interfaces para bibliotecas GTK. Foram adicionadas interfaces para gstreamer e bibliotecas comumente usadas em aplicativos GTK.
- Adicionado suporte inicial (atualmente apenas em modo de interpretação) para as arquiteturas RISC-V e PPC64LE.
- Correções foram implementadas visando melhorar o suporte ao SteamPlay e à camada Proton. Agora é possível executar muitos jogos para Linux e Windows do Steam em placas AArch64, como Raspberry Pi 3 e 4.
- Melhorias na gestão de memória, funcionamento do mmap e rastreamento de violações de proteção de memória.
- Melhorado o suporte à chamada do sistema clone no libc. Suporte para novas chamadas do sistema foi adicionado.
- No mecanismo de recompilação dinâmica, melhorias foram feitas no trabalho com os registradores SSE/x87, suporte para novos códigos de máquina foi adicionado, transformações numéricas float e double foram otimizadas, o processamento de transições internas foi melhorado e a adição de suporte a novas arquiteturas foi simplificada.
- Melhorado o carregador de arquivos no formato ELF.
Fonte: opennet.ru
