1 pontos por GN⁺ 2023-12-10 | 1 comentários | Compartilhar no WhatsApp
  • Murder Engine é um motor de jogo ECS para pixel art construído sobre o FNA, ainda em desenvolvimento, com muitas mudanças e possibilidade de breaking changes
  • Como exemplos para começar, são sugeridos o projeto de game jam neocityexpress e o hellomurder, que mostram o fluxo de criação de mundos, entidades e componentes
  • A estrutura do projeto separa game e game.editor, e adota a abordagem de controlar o editor diretamente dentro do projeto do usuário, sem um editor.exe separado
  • O ambiente de desenvolvimento oferece suporte a Linux, MacOS, Windows e Steam Deck, requer o .NET 8 SDK, e os jogos têm como alvo Linux, MacOS e Windows
  • Ainda não há pacote NuGet, então o recomendado é referenciar via git submodule no .csproj; no momento, não há plano oficial de suporte para web ou mobile

Natureza e estado do Murder Engine

  • Murder Engine é um motor de jogo ECS para pixel art baseado em FNA
  • O motor ainda está em desenvolvimento e, embora a branch de release tente se manter estável, é preciso esperar muitas mudanças e partes ainda inacabadas
  • O README alerta com “Proceed at your own risk” e deixa explícita a possibilidade de breaking changes

Exemplos iniciais e caminho para aprender ECS

  • Para quem prefere entender rapidamente vendo exemplos, o fluxo recomendado é começar pelos seguintes projetos
  • Para entender como o ECS é aplicado no Murder, a documentação do Bang é indicada
    • Bang é o framework ECS usado pelo Murder

Estrutura do projeto e abordagem do editor

  • A estrutura de um projeto Murder é dividida em resources, src/game e src/game.editor
    • game inclui bin, packed e resources para o jogo final
    • game.editor inclui bin e resources para o editor do jogo
  • Não existe um editor.exe externo; só existe o próprio projeto do usuário
  • Essa estrutura foi escolhida para permitir controlar o projeto inteiro diretamente, de forma parecida com o desenvolvimento de projetos em MonoGame ou FNA
  • O editor fica em um projeto separado para impedir que o código do editor toque o código do jogo e para dar liberdade total ao lado do editor

Build e forma de dependência

  • No momento, não existe pacote NuGet para o Murder
  • A forma recomendada é adicionar o Murder como git submodule e referenciá-lo no .csproj
  • Um exemplo de referência está em HelloMurder.csproj

Requisitos e plataformas suportadas

  • O ambiente de desenvolvimento para rodar o editor oferece suporte a Linux, MacOS, Windows e Steam Deck
  • O requisito necessário é ter o .NET 8 SDK instalado
  • As plataformas-alvo dos jogos são Linux, MacOS e Windows
    • No Linux, isso inclui o Steam Deck
  • O suporte a consoles está em andamento
  • No momento, não há plano oficial de suporte para web nem para mobile em iOS e Android

Contribuição e feedback

  • O projeto ainda está em um estágio muito inicial
  • É possível entrar em contato com a criadora para sugestões ou feedback; ela informa ter interesse em uso real do projeto e retorno dos usuários

1 comentários

 
GN⁺ 2023-12-10
Opiniões no Hacker News
  • Vi que tinha o nome saint11 e tive certeza de que seria bom. Os tutoriais de pixel art são muito bem organizados: http://saint11.org/blog/pixel-art-tutorials/

    • Eu não conhecia, mas só de dar uma olhada rápida já fiquei convencido de que é o melhor blog de toda a internet
    • Não sabia que era a mesma pessoa. Vi esse tutorial tempos atrás, e o jeito como o conteúdo é mostrado e desdobrado era excelente
    • Parece que saint11 foi a pessoa responsável pela arte do jogo Celeste
    • Participou de Celeste e Towerfall, e ambos têm pixel art excelente. Parece ter muito talento mesmo
  • Novos motores de jogo e frameworks ECS são divertidos de ver. Olhando para Bang, a parte de ECS, há exemplos de componentes como CarComponent e sistemas como CarMoverSystem; os sistemas são classes, e a interface que implementam parece determinar o momento de execução
    Lembra um pouco DOTS, mas ainda não encontrei onde os sistemas são adicionados ao jogo nem como sistemas do mesmo tipo são ordenados. Também tenho curiosidade sobre como seria um sistema que faz várias consultas diferentes, como carros e obstáculos
    Bang parece usar um gerador de código-fonte. Diferentemente de GetComponent, TryGetVelocity, RemoveFriction e SetVelocity parecem ser gerados com base na existência dos componentes Velocity e Friction, talvez por causa de cache de IDs de componentes, mas não tenho certeza
    Não é baseado em arquétipos; cada entidade armazena um dicionário component id => component, e cada sistema acompanha quais entidades correspondem ao seu filtro. Não sei quão bom será o desempenho, mas em muitos jogos a conveniência no desenvolvimento pode ser mais importante que performance
    As mudanças também parecem ser aplicadas imediatamente. Então fico curioso: quando um sistema adiciona/remove componentes de uma entidade e isso muda se ela corresponde ou não ao filtro, se ela é processada no mesmo tick depende do ID da entidade?

    • Também tenho curiosidade sobre a ordem de execução dos sistemas. Ter que adicionar novos sistemas manualmente a uma lista fixa pode ser frustrante, mas, ao mesmo tempo, sistemas frequentemente têm dependências implícitas entre si, então também é importante fixar a ordem de execução em tempo de compilação
      Dando uma olhada rápida na documentação, não vi uma forma de indicar explicitamente essas dependências ou a ordem, e fico curioso para saber como este engine lida com isso
  • A página no Itch e o download de um jogo de jam feito com este framework: https://saint11.itch.io/neo-city-express
    É impressionante para um jogo de jam de 72 horas. A arte e o texto são bons, e há diversão mecânica de um jeito inesperado

  • Muito bom. O editor é extremamente estiloso, gostei bastante. Sempre gostei do MonoGame por ter boa performance e ser multiplataforma, mas nunca fiz um jogo grande com ele, só alguns demos de vez em quando

  • Parece bom. Fico me perguntando se no desenvolvimento de jogos em C# existe problema com pausas do GC

    • Funcionou bem usando gerenciamento simples de objetos e chamadas explícitas a GC.Collect() em pequenos múltiplos do atraso da simulação. O ponto ideal parece depender do conteúdo da cena e do estilo de gameplay, ou seja, de como os objetos da cena mudam
      Em cenas e gameplay no estilo Q3A, é muito sólido. Como há poucos elementos de cena mudando a cada tick, as pausas do GC são em grande parte desprezíveis
      No .NET 6+, em um engine DIY, as pausas do GC foram medidas em torno de 1 a 5 ms quando chamado repetidamente de forma estratégica. Desativar o GC concorrente/servidor/em segundo plano nas configurações do projeto e usar GC em primeiro plano + workstation foi o que gerou menos jitter
      As opções parecem ser gerenciar a memória 100% manualmente ou limpar o lixo com a maior frequência possível. No .NET moderno, é quase impossível desligar completamente o GC sem alguma magia negra como hacks de DLL de baixo nível. Se você puder reiniciar o processo entre eventos de trabalho ou rodadas de jogo, Process.Exit() também é uma técnica de GC válida em alguns contextos
    • Existe. Há uma boa apresentação do Miguel de Icaza sobre a história da adição de C# a engines de jogos e sobre por que ele está empolgado em usar Swift no Godot, argumentando que a contagem de referências do Swift evita o problema das pausas do GC
      https://youtu.be/tzt36EGKEZo?si=WNxwcTPGFbJABKez
    • Acho que o problema de GC existe quase só no Unity. Outros engines de jogos que usam .NET comum, como Stride, funcionam sem problemas
    • Existe. O Unity, claro, e até o Unreal têm GC, então é preciso alocar no início e usar object pooling
    • Como na maioria das outras linguagens, C# também pode ser escrito de modo a evitar alocações
  • Só lendo o link não dá para saber bem, mas fico curioso sobre quão difícil seria fazer um jogo em F# com o engine Murder

  • Usei um pouco ECS no Unity, e o ECS do Murder foi muito mais fácil. Os desenvolvedores fizeram um trabalho realmente bom
    Fiz um pequeno projeto de jogo arcade com Murder, jogável aqui: https://nopetrides.itch.io/bombs-away

    • Você poderia explicar as diferenças com um pouco mais de detalhe?
  • Na página de apresentação do saint11 está escrito: “Murder Engine: 2D Pixel art C# ECS Game Engine made by Isa! I usually help on the render and physics side of it.”
    Isa: https://isadorasophia.com/projects/

  • Não tem relação com o engine de jogo, mas acho engraçado que uma pessoa mal-intencionada poderia dizer que “as pessoas daquele site de hackers estão discutindo murder”
    Ultimamente tenho pensado bastante em como esse tipo de material totalmente inofensivo poderia ser usado por um adversário persistente

    • Parece meio forçado, mas houve pessoas que levaram artigos do The Onion ao pé da letra
      Ainda assim, em um caso tão fácil de refutar, não sei se haveria grande diferença entre dizer “as pessoas estão discutindo murder” e uma mentira descarada
    • Pensar desse jeito, só que ao contrário, é a única forma de consumir notícias da mídia de massa. Hoje em dia tudo é enviesado e ridículo a um ponto difícil de acreditar
  • O que é ECS?

    • Deve ser Entity Component System. É uma arquitetura comum em engines de jogos
    • É uma arquitetura de alto desempenho que está na moda. A Unity vem tentando popularizá-la bastante recentemente