2 pontos por GN⁺ 2023-06-26 | 1 comentários | Compartilhar no WhatsApp
  • 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 clang em todos os sistemas operacionais, aplica /fp:strict em builds para Windows e -ffp-model=strict em builds para ARM, e substitui funções matemáticas como std::sin e std::sqrt por 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-keygen se 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

 
GN⁺ 2023-06-26
Comentários do Hacker News
  • Eu não sabia que, para obter um comportamento 100% determinístico com ponto flutuante, é preciso usar o mesmo compilador mesmo usando as mesmas funções matemáticas
    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-...
    • Pelo que entendo, o padrão está mais para não especificar as funções matemáticas
      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ções
      O IEEE 754 pode regulamentar multiplicação, mas sqrt, sin, cos, tan exigem que o método de cálculo seja definido, e normalmente essa implementação fica na biblioteca padrão fornecida pelo compilador
      Alé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 divergir
    • Não tenho certeza se o determinismo é garantido mesmo entre arquiteturas diferentes
      O 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
    • Há um texto bem longo da época da Sun; como agora pertence à Oracle, talvez seja mais fácil ler a conclusão primeiro e ir voltando
      https://docs.oracle.com/cd/E77782_01/html/E77791/z4002282485...
    • O determinismo de ponto flutuante, em teoria, parece algo que deveria funcionar de forma determinística, mas na prática é quase uma terra sem lei
      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
    • Mesmo usando o mesmo compilador, se o -march mudar o resultado pode variar bastante
  • A parte de “o networking se baseia no determinismo da simulação multiplataforma” já era algo que o Springrts[0] fazia no fim dos anos 2000 pelo mesmo motivo, e imagino que muitos RTS também
    Só 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/
    • Essa parte aparece nos detalhes abaixo do título citado
      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
    • Joguei Spring por muito tempo com Balanced Annihilation
      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
  • Parece interessante, mas o título estava realmente difícil de ler
    • Também achei, e ainda acho que continua um pouco ambíguo
      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...
  • Gosto muito desse tipo de post e projeto, e agradeço por ser disponibilizado como open source
    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
  • Parece muito legal
    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
  • Uma conquista impressionante, e o jogo parece excelente
    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
    • Mais recentemente, trabalhei com programação de gameplay neste minigame de PUBG: https://www.youtube.com/watch?v=tSP5P0QGWa4
      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

  • Reconstruir o estado físico quando o cliente se conecta é uma solução elegante para o problema de sincronização
  • Primeiro, isso parece incrivelmente incrível e ver algo assim me faz perceber de novo o quanto eu não sei sobre ciência da computação
    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
    • Foi mal pelo problema no MacOS
      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
  • Caramba, só agora percebi que venho acompanhando alguns dos seus textos sem querer há alguns anos
    Especialmente os sobre ECS e redes
    É bom ver o quanto isso evoluiu
    • Escrevi algo sobre ECS no Stack Exchange em 2013, mas acho que esta é a primeira vez que publico algo de fato sobre redes
      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
  • A jogabilidade lembra Infantry Online, aquele antigo shooter multiplayer top-down do começo dos anos 2000
    https://www.freeinfantry.com/
    https://en.m.wikipedia.org/wiki/Infantry_(video_game)