Mesa redonda sobre design orientado a dados: Suas perguntas, respondidas

FERGUS BAIRD / UNITY TECHNOLOGIESSenior Content Marketing Manager
Feb 28, 2024|9 Min
Mesa redonda sobre design orientado a dados: Suas perguntas, respondidas
Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.

Em dezembro, organizamos uma mesa redonda de criadores focada no DOTS com a Stunlock Studios (V Rising) e Sunblink Entertainment(HEROish, Hello Kitty Island Adventure). Convidamos esses pioneiros a compartilhar suas experiências usando a pilha de tecnologia orientada a dados (DOTS), mostrar quais recursos e capacidades a programação orientada a dados desbloqueou para seus jogos e ver como eles estão aproveitando a tecnologia mais recente do Entity Component System (ECS) no Unity 2022 LTS.

As perguntas e respostas foram muito bem recebidas durante o webinar, com muitas perguntas perspicazes do público - tantas que não conseguimos responder a todas ao vivo. Para dar continuidade, pedimos a Joe Valenzuela, diretor de engenharia de software da Unity, e Rasmus Höök, diretor técnico da Stunlock Studios, que respondessem a algumas de nossas perguntas favoritas da sessão. Confira-os abaixo e assista ao webinar Maximize o potencial do seu jogo com design orientado a dados sob demanda aqui.

V Rising da Stunlock Studios

"É melhor iniciar novos projetos com DOTS imediatamente ou com GameObjects comuns e, em seguida, otimizar o desempenho migrando para o ECS (puro ou híbrido)?"

JOE VALENZUELA: O ECS, o DOTS e o design orientado a dados (DOD) não se referem apenas a um melhor desempenho. Também se trata de evitar a complexidade inerente ao modelar problemas usando a programação orientada a objetos (OOP).

Qualquer pessoa que pretenda criar um jogo multijogador, especialmente um com um servidor confiável e previsão do lado do cliente, deve considerar seriamente começar com o DOTS. O Netcode for Entities oferece um sistema realmente robusto e poderoso que se expande e permite que você escreva códigos de jogabilidade simples.

Se não estiver criando um jogo para vários jogadores, ou se estiver apenas criando protótipos e quiser experimentar coisas novas rapidamente, talvez queira considerar a possibilidade de aproveitar o MonoBehaviour/GameObjects.

"É possível criar um jogo inteiramente no sistema DOTS ou o DOTS é compatível apenas com o sistema GameObject?"

JOE VALENZUELA: Não, você provavelmente precisará de alguns GameObjects em algum momento. É algo em que estamos trabalhando.

"Quais são as desvantagens ou os casos de uso em que um desenvolvedor não deve usar o DOTS?"

JOE VALENZUELA: Você provavelmente está perguntando à pessoa errada - não consigo pensar em um caso em que eu preferiria usar algo diferente de DOTS no Unity! Mas, se você torcer o braço, acho que direi que os projetos tradicionais baseados em MonoBehaviour/GameObject são realmente excelentes quando você está criando protótipos. Quando se espera mudanças rápidas, você não quer necessariamente gastar muito tempo criando Bakers ou projetando seus dados. Essa é uma área que esperamos simplificar para o DOTS no futuro.

"Rasmus, você tem algum conselho para aumentar o número de engenheiros em programação orientada a dados?"

RASMUS HÖÖK: Acho que um bom começo é escrever o código mais direto e simples que puder para resolver o problema real que você tem. Entre na mentalidade de um programador iniciante e escreva código muito orientado a resultados, em que o objetivo é fazer com que o código faça o que você deseja. O objetivo inicial não deve ser escrever código reutilizável, criar abstrações ou qualquer outra coisa.

No contexto de começar a usar o ECS, não pense demais nem se esforce demais. Em vez disso, use componentes maiores e sistemas maiores no início, em vez de dividi-los em muitas partes menores. Isso tornará seu código mais fácil de seguir. Separe-se mais tarde, quando você tiver um motivo para isso. Definitivamente, cometemos esse erro logo no início.

Eu diria que uma boa oportunidade para praticar a programação orientada a dados é quando você tem algo que precisa otimizar. Assim, você terá um problema real que poderá experimentar e medir o resultado. Você também verá como é importante pensar sobre os dados.

"Ouvimos muito sobre o uso de DOTS para aumentar a escala e criar jogos mais ambiciosos, mas será que há vantagens em diminuir a escala? Como usar o DOTS em um projeto pequeno para atingir sistemas de baixo custo?"

JOE VALENZUELA: A operação eficiente em sistemas de baixo consumo de energia melhora a qualidade do código de simulação que eles podem executar. Ele também reduz os requisitos de bateria para dispositivos operados por bateria, levando a um tempo de execução mais longo e à integridade geral do sistema.

V Rising da Stunlock Studios
V Rising da Stunlock Studios

"Ao mudar de SystemBase para ISystem, como você lida com as chamadas para o código gerenciado?"

JOE VALENZUELA: Tecnicamente, você não precisa se livrar do código gerenciado para usar o ISystem - o código gerenciado pode ser chamado a partir do ISystem. Seus dados gerenciados não podem ser armazenados diretamente em um ISystem - para isso, eu usaria dados de componentes gerenciados.

No entanto, se você estiver se perguntando: "Como faço para eliminar as chamadas para o código gerenciado do ISystem para que eu possa usar o Burst e obter o melhor desempenho do meu código?", a resposta é... depende.

Se estiver usando contêineres .NET, poderá encontrar um substituto adequado em com.unity.collections. Se você estiver fazendo interface com uma API gerenciada do Unity e não houver uma alternativa não gerenciada, às vezes é útil dividir o trabalho em fases de "buscar dados" e "processar", sendo que a última é onde você faz o processamento baseado no ISystem.

"Li na documentação que o ECS não é compatível com a arquitetura de várias cenas. Então, como essa abordagem deve ser feita usando o ECS?"

JOE VALENZUELA: Nada no ECS impede o carregamento aditivo de várias cenas do Unity. No entanto, essas cenas não conterão dados de ECS, apenas GameObjects com MonoBehaviours.

Você pode criar qualquer número de subcenas, e cada uma delas transformará os dados de GameObjects e MonoBehaviour de criação em dados compactos de entidades e componentes que podem ser carregados em tempo de execução. As subcenas podem ser divididas em seções e cada seção pode ser transmitida para dentro ou para fora, conforme necessário.

"Até que ponto ter monocomportamentos/DOTS híbridos afeta o determinismo em um projeto?"

JOE VALENZUELA: O determinismo não é um estado binário, e não garantimos que todos os detalhes da execução sejam idênticos entre as execuções. Em geral, a interoperabilidade híbrida às vezes é necessária para detalhes de apresentação, como sistemas de partículas ou áudio, em que não é necessária uma reprodução perfeita por quadro.

Para recursos como a jogabilidade preditiva, você vai querer que sua simulação seja executada no ECS.

Como você gerencia centenas de sistemas? Todos eles são executados o tempo todo e simplesmente não executam a lógica quando não há entidades na consulta? Ou você ativa os sistemas contextualmente com base no estado do jogo?

JOE VALENZUELA: Para facilitar o desenvolvimento, fizemos a atualização dos sistemas por padrão. A diferença de desempenho não é enorme, mas, se você realmente tiver centenas de sistemas, poderá se beneficiar da atualização latente chamando RequireForUpdate ou usando o atributo RequireMatchingQueriesForUpdate.

A linguagem nesse caso é adicionar um RequireForUpdate<Foo>() ao sistema relevante e usar Foo IComponentData em suas cenas como uma espécie de sinalizador para ativar a atualização desses sistemas.

"Entendo que o DOTS melhora o desempenho em termos de manipulação de grandes quantidades de dados durante o tempo de execução, durante o jogo (especialmente a renderização, pelo que ouvi). No entanto, também ouvi dizer que o DOTS melhora o desempenho da produção em termos de facilitar qualquer refatoração necessária. Você poderia falar um pouco sobre como o DOTS ajuda na refatoração?"

JOE VALENZUELA: Do meu ponto de vista, um grande apelo do DOTS, do ECS e do DoD em geral é que eles tornam mais visível e inspecionável o estado da simulação. Se você já tentou adicionar testes a uma biblioteca OOP, talvez tenha se deparado com o problema de ter que simular ou instanciar uma enorme quantidade de funcionalidades para replicar o estado necessário para invocar uma instância de método "simples". Com os sistemas do estilo DoD, quase sempre é possível representar um núcleo de transformação como uma função autônoma que transforma um tipo de valor em outro.

Isso é muito mais fácil de raciocinar, testar e paralelizar.

"Em minha experiência (amadora), acho que o DoD cria um acoplamento rígido entre os dados e a arquitetura, fazendo com que as alterações nas estruturas de dados introduzam um grande trabalho de refatoração. Essa é sua experiência? Como você lidou com esse problema ou o evitou?"

RASMUS HÖÖK: Em nossa experiência, quando alteramos os dados, geralmente temos que alterar o código que os está usando, mesmo antes de usar o ECS. Portanto, não sofremos mais do que estamos acostumados!

JOE VALENZUELA: Não acho que esse seja um problema fundamental do DoD ou até mesmo do nosso ECS, pelo menos em sua evolução ao longo do tempo.

Por um lado, o método tradicional de romper o acoplamento estreito na OOP é, em geral, criar funções orientadas por instância e hierarquias de classe. Embora isso seja bom em teoria, esse tipo de abstração é uma das primeiras coisas a desaparecer na programação de desempenho.

Não há nada que o impeça de escrever funções utilitárias em um ECS. Embora seja verdade que em nosso ECS você precisa revisitar os sistemas quando altera o contrato de dados para consultas específicas, isso pode ser um sinal de que você está consultando dados de forma dispersa. Você está transformando repetidamente os dados dos componentes? Isso pode ser reescrito para reduzir o número de mutações por quadro? Ler repetidamente os dados do componente? Talvez você possa colocá-lo em uma estrutura de dados imutável no início do quadro.

Por fim, acho que é seguro dizer que o DoD, ou pelo menos o ECS, explicita muito mais o estado do problema. Isso não é negativo: Essa é uma troca diferente. Prefiro muito mais raciocinar sobre um acoplamento estreito durante a refatoração do que um frouxo ou implícito.

"O ECS/OOP funciona bem para jogos para celular ou você pode recomendar essa abordagem para um projeto de jogo para celular? Algum risco ou consideração?"

JOE VALENZUELA: Vários clientes usaram com sucesso o ECS em seus jogos para celular. Confira esta palestra da GDC para ver como a Sunblink Entertainment o utilizou para o HEROish.

"Como você fez o networking do V Rising? Você usou o Netcode for Entities ou outra estrutura?"

RASMUS HÖÖK: Criamos nossa própria estrutura. Começamos a usar DOTS para produção muito cedo e estávamos cientes dos riscos de fazer isso. Para eliminar o maior número possível de riscos, tentamos confiar no menor número possível de pacotes e desenvolvemos nossos próprios pacotes quando possível. Sempre criamos jogos multijogador e sempre usamos nossas próprias soluções, por isso nos sentimos confortáveis em fazer isso sozinhos.

"O ECS é estável o suficiente para a produção? Nos últimos meses, temos tido dificuldades com um protótipo e não temos certeza se foram dores de crescimento à medida que aprendemos ou se ele ainda não está pronto para se tornar um projeto de produção ECS puro."

RASMUS HÖÖK: Eu diria que ele é estável o suficiente para produção, mas faltam recursos que muitos desenvolvedores de jogos podem considerar garantidos. Nosso código de jogabilidade é puro ECS no V Rising, mas os elementos de apresentação, como personagens animados, efeitos de partículas e interface do usuário, estão todos usando GameObjects. Realisticamente, acho que uma abordagem híbrida é a melhor maneira para a maioria das equipes que iniciam um projeto hoje.

Fizemos o V Rising usando uma abordagem unidirecional. Usamos o ECS puro para enviar dados apenas para GameObjects, nunca o contrário. Por exemplo, mantemos o estado de um personagem nos dados do ECS - entrada, velocidade, etc., que decidirão o estado de locomoção e qual animação deve estar ativa e em que momento e velocidade. Em seguida, garantimos que o animador do GameObject esteja nesse estado. O estado em que o animador se encontra nunca afeta a jogabilidade. Acho que essa separação simplifica o jogo de modo geral.

JOE VALENZUELA: O ECS está pronto para produção e é usado por clientes em todo o mundo, mas ainda temos um longo caminho a percorrer até que a experiência seja tão perfeita quanto gostaríamos. Fique atento aos futuros desenvolvimentos - e obrigado por usar o DOTS!

Transforme seu jogo ambicioso em realidade com o DOTS, que permite criar jogos dimensionáveis e de alto desempenho e experiências inesquecíveis. Obtenha os recursos mais recentes com o Unity 2022 LTS e experimente a tecnologia mais recente no Unity 6 Preview.