Counter-Strike roda no PSP a 60 FPS graças a engine open source em Rust e JavaScript

Um projeto chamado OpenStrike colocou um FPS single-player no estilo de Counter-Strike rodando travado em 60 frames por segundo no PlayStation Portable original. O jogo usa mapas no formato clássico GoldSrc, bots, sistema de rounds, recuo de armas e tracers. Tudo isso dentro de um único arquivo que cabe no Memory Stick do portátil de 2004.
O que chamou atenção no vídeo que circulou foi ver o jogo em ação e, ao mesmo tempo, o DevTools aberto inspecionando o HUD. O HUD inteiro foi construído com SolidJS e Tailwind, do mesmo jeito que se faz interface web hoje. O interpretador que roda esse código no PSP é o QuickJS, leve o suficiente pra entrar junto com o resto do jogo.
O motor pesado (física, IA dos bots, colisões e renderização) está em Rust, usando o renderer Pocket3D. A parte que realmente define o jogo (regras de round, tabelas de armas, comportamento dos bots) está em TypeScript. O HUD é um componente Solid normal. Os dois lados se falam uma vez por frame: o Rust manda o estado atual e os eventos, o JavaScript responde com comandos. Nada de JavaScript travando a simulação.
O PSP tem 32 MB de RAM no total (24 MB disponíveis pro programa), CPU MIPS de 333 MHz sem JIT e uma GPU fixa sem shaders programáveis. Mesmo assim o jogo mantém 60 FPS estáveis no hardware real. O executável inteiro fica em torno de 6 MB. O pico de uso de memória durante o jogo fica na casa dos 10-12 MB, segundo os números divulgados. Sobram vários megabytes livres.
Pra conseguir isso, quase tudo que podia ser resolvido em tempo de build foi resolvido ali. O mapa BSP passa por um cooker que transforma as texturas em CLUT8, joga a iluminação direto na cor dos vértices e quantiza posições pra 16 bits. O PVS (a estrutura de visibilidade de 1999) continua sendo usado pra não desperdiçar tempo desenhando o que não aparece na tela. O JavaScript só entra uma vez por frame e, depois de ajustar os sinais do Solid pra atualizar só o que mudou, o custo dessa parte caiu pra cerca de 2 ms por frame.
O lado mais interessante pra quem mexe com web é o sistema de mods. As regras vivem num arquivo rules.ts e o HUD num hud.tsx. Mudar esses arquivos é fazer um mod de verdade. O motor não dá nenhum privilégio pro código base que não daria pra um mod. Qualquer pessoa que já escreveu React ou Solid consegue entrar no projeto e alterar comportamento do jogo sem precisar recompilar o Rust.
O código está no GitHub em pocket-stack/open-strike, licenciado em MIT. Tem build pro desktop com cargo run e o EBOOT.PBP pronto pro PSP (precisa de custom firmware ou emulador como o PPSSPP). Os mapas e texturas é fornecida pelo jogador, já que o projeto não inclui arquivos do Counter-Strike original por questões de direitos. O time testou com oito mapas clássicos da era GoldSrc e qualquer mapa desse formato funciona.
No blog do PocketJS tem o relato completo de como tudo foi feito, desde o loop de 16,7 ms até as decisões de como fazer JavaScript interpretado caber num aparelho de 2004 sem virar slideshow. É uma leitura boa pra quem curte entender como as coisas realmente funcionam por baixo.
Aproveite que está aqui e siga o Arkade no
Aproveite e confira o melhor das ofertas em games na Amazon
Ganhamos uma pequena comissão nos links compartilhados em nossos posts. Você não gastará nada mais com isso e ainda apoiará o jornalismo independente de games e cultura.