Hypersomnia - shooter multiplayer de código aberto e a tecnologia usada em Assassin's Creed: Valhalla e drones da Skydio
(github.com/TeamHypersomnia)- Hypersomnia é um shooter multiplayer guiado pela comunidade, com suporte a duelos entre amigos e batalhas entre dois clãs, e é um jogo com partidas online desde 2017
- Foi escrito em C++ moderno e implementado sem engine de jogo, sendo oferecido como um jogo gratuito e de código aberto
- A composição do jogo combina as táticas de Counter-Strike, a dinâmica de Hotline Miami e a nostalgia da pixel art dos RPGs old-school; atualmente oferece 24 armas únicas, 10 mapas da comunidade e dois modos: Bomb defusal e Gun game
- Os canais de distribuição incluem jogar no navegador, Steam, Windows, Linux AppImage e macOS dmg; ao iniciar o jogo, é executado um tutorial interativo
- O servidor pode ser executado via Server Docker ou Headless AppImage, e todos os arquivos são assinados digitalmente, com um caminho fornecido para verificação da assinatura
- O editor de mapas embutido funciona de forma 100% WYSIWYG, trabalhando diretamente no mundo do jogo; foi feito com ImGui e usa formato de mapa em JSON
- Se você colar pastas PNG, WAV e OGG no diretório do mapa, o jogo as reconhece automaticamente
- Se você arrastar e soltar um GIF na cena, ele funciona imediatamente como animação dentro do jogo
- O mapa em que você está trabalhando pode ser testado com um clique, e os clientes conectados baixam automaticamente a versão atual do mapa e os recursos personalizados
- Servidor, jogo e editor estão no mesmo executável em todos os sistemas operacionais, então é possível iniciar uma sessão no editor, interrompê-la com ESC e voltar ao estado original
- A rede é baseada em determinismo de simulação multiplataforma, funcionando de forma 100% determinística entre cliente de navegador, clientes nativos de Windows, Linux e macOS, além de builds nativos para ARM
- Em vez de enviar continuamente pela rede o estado de todos os objetos, apenas as entradas do jogador são transmitidas, e o restante é simulado localmente por cada cliente
- Para garantir determinismo em cálculos de ponto flutuante, usa
clangem todos os sistemas operacionais, aplica/fp:strictem builds para Windows e-ffp-model=strictem builds para ARM, e substitui funções matemáticas comostd::sinestd::sqrtpor implementações da família STREFLOP - Em um exemplo com dois personagens controlados por jogadores, o tráfego com tickrate de 60 Hz é de cerca de
40 kbit/s (= 5 KB/s), e apenas personagens controlados por jogadores contribuem para o tráfego de rede
- O cliente de navegador e o cliente nativo podem jogar juntos no mesmo servidor graças a libdatachannel e datachannel-wasm
- É possível hospedar o servidor no navegador e conectar com um cliente nativo, ou abrir o servidor no cliente nativo e enviar um link de acesso para o navegador
- A versão para navegador oferece login com Discord, partidas ranqueadas e leaderboards globais; ao vincular a conta do Discord à conta da Steam, as versões Steam e web compartilham a mesma classificação
- O rectpack2D, criado para empacotamento de texturas, é usado em Assassin's Creed: Valhalla, por uma fabricante de drones e em dois artigos científicos
- A implementação do pool de memória oferece armazenamento contíguo, alocação O(1), liberação O(1), desreferenciação O(1), expansão automática e comportamento determinístico; ao transmitir o estado inicial do mundo, inclui até o estado interno do pool de objetos do jogo para que o cliente possa simular de forma determinística os mesmos identificadores de objetos e a mesma ordem de memória
- O self-updater embutido baixa e aplica atualizações automaticamente, verifica por meio de uma chamada a
ssh-keygense a atualização veio da chave pública do desenvolvedor embutida no código, e, se o host de builds for comprometido e uma versão maliciosa for publicada, os clientes existentes recusam a aplicação da atualização
1 comentários
Comentários do Hacker News
Fiquei me perguntando se a aritmética de ponto flutuante não era totalmente especificada, mas eu deveria ter pesquisado antes: https://stackoverflow.com/questions/49471943/floating-point-...
Não termina em uma única instrução
sqrt; em vez disso, começa com uma aproximação de Taylor e depois refina a resposta rodando o método de Newton algumas vezes, o que abre escolhas como a ordem da série de Taylor, o ponto central e o número de iteraçõesO IEEE 754 pode regulamentar multiplicação, mas
sqrt,sin,cos,tanexigem que o método de cálculo seja definido, e normalmente essa implementação fica na biblioteca padrão fornecida pelo compiladorAlém disso, ponto flutuante não satisfaz a propriedade associativa, então
(a+b)+c != a+(b+c), e só mudar a ordem das operações básicas já pode fazer o resultado divergirO modo de arredondamento pode variar entre arquiteturas, e misturar arm/amd/intel pode acabar produzindo comportamento não determinístico: https://en.wikipedia.org/wiki/IEEE_754#Reproducibility
Parece que este jogo evita esse problema usando uma implementação de ponto flutuante em software, e somando isso a um compilador unificado dá para escapar da maioria desses problemas
https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
Em C e várias outras linguagens, operadores comuns não são mapeados explicitamente para operações específicas de ponto flutuante, então o compilador tem bastante margem de manobra
Também se usa até certo ponto um estado global invisível, como modos de arredondamento; pelo que me lembro, o DirectX costumava mudar flags nos bastidores
-marchmudar o resultado pode variar bastanteSó não era open source, e isso não quer dizer que não seja uma conquista. Na verdade, é algo realmente difícil
[0] https://springrts.com/
A diferença aqui é que jogos RTS não usam física determinística com ponto flutuante, então o Hypersomnia precisou de uma solução nova
Preencheu o vazio deixado por TA e SupCom, e SupCom 2 era um RTS menor e mais casual que até era bem bom por si só, mas não chegava lá
E melhor nem falar de PA
O BAR também parece bem promissor: https://www.beyondallreason.info
O jogo em si não foi parar no AC:Valhalla; o que entrou lá foi a biblioteca de empacotamento de texturas criada durante o desenvolvimento[1]. Claro, isso não diminui a conquista, e por si só já renderia um post
Também me parece um pouco exagerado dizer que foi a origem do sistema ECS usado na Unity. Eu já tinha usado engines com ECS antes de 2010, e no lado das game engines isso parece vir de Operation Flashpoint[2]
[1] https://github.com/TeamHypersomnia/rectpack2D
[2] https://t-machine.org/index.php/2007/09/03/entity-systems-ar...
Quando eu tiver tempo algum dia, provavelmente depois de me aposentar, queria tentar fazer algo assim, e projetos desse tipo têm grande chance de servir como material para aprender esse universo
Lembra o ARC do fim dos anos 90, ou Attack Retrieve Capture, que hoje sobrevive por um fio como Armor Critical
https://en.wikipedia.org/wiki/Attack_Retrieve_Capture
http://armorcritical.com
Fico curioso sobre que outros trabalhos comerciais eles fizeram para manter o projeto, se há planos de lançamento no Steam e como o mundo persistente afeta a jogabilidade
Também queria saber como essa técnica engenhosa de reconstruir o estado físico quando novos jogadores entram aparece para quem já está jogando, por exemplo se a posição das balas se move
Também investi bem minhas economias, então consegui me dedicar totalmente ao Hypersomnia
Quero lançar no Steam antes do fim de 2024
No momento, não existe nenhum mundo persistente, e isso foi só uma menção em tom de teaser sobre a direção que poderia seguir no futuro se o jogo fizer sucesso
A reconstrução física não deve mover a posição em nada. O que é reconstruído são apenas os “estados quentes”, como contatos ou árvores, e esse estado só é relevante no momento em que a simulação avança de um estado para o seguinte, então não afeta a renderização depois disso
O único impacto possível para os jogadores existentes é uma queda pontual de frame quando o mundo físico a ser reconstruído é enorme, mas na prática todos os mapas ainda são pequenos e funcionam melhor em partidas 3v3
Em segundo lugar, encontrei um bug grande no MacOS. Na tela de pausa/configurações, a entrada do mouse fica muito desalinhada, então não dá nem para clicar nas opções do menu principal
Reuni captura de tela, logs e relatório do sistema: https://youtu.be/O4OoMdeFAt0
Quase sempre jogo no Windows e no Linux, então não deixei o MacOS rodando por muito tempo, mas vou ver se consigo corrigir
Especialmente os sobre ECS e redes
É bom ver o quanto isso evoluiu
Eu até linkei um post importante do blog do Glenn Fiedler ao explicar a arquitetura determinística no README, mas eu não sou ele, então, se isso causou alguma confusão, não foi a intenção
https://www.freeinfantry.com/
https://en.m.wikipedia.org/wiki/Infantry_(video_game)