Otimização do Unity: como a hierarquia de cenas o rouba

Então, você otimizou as partes mais óbvias do seu jogo. No entanto, esse não é realmente o caso. Você perdeu um ponto complicado e pouco perceptível: otimizar a hierarquia da cena do Unity.

E o que há de errado com a hierarquia? Deixe-me mostrar uma coisa.

Inicie o Unity e abra seu projeto de jogo. Em seguida, execute o jogo no dispositivo de destino
e conecte o Unity Profiler a ele. Grave alguns quadros durante o jogo.

No Unity Profiler, procure os seguintes marcadores desagradáveis ​​do profiler :


Não encontrou? Continue procurando, tenho certeza de que há pelo menos um.

Pode ser UpdateRendererBoundingVolumes , Physics.SyncColliderTransform ou TransformChangedDispatch .

Eles aparecerão quando você estiver pronto para desistir. Eles ocorrerão quando você já passar o mouse sobre o botão Fechar do Profiler.

Você encontrou? Se sim, você está com sorte. Eu também os encontrei em um dos meus projetos anteriores e descobri como me livrar completamente deles. Eu percebi que mal está escondido neles ...

Deseja aprender os segredos do desempenho da hierarquia de cenas do Unity ?

Desenvolvedor de nível 1: Hierarquia típica da cena da unidade


Ainda me lembro do primeiro projeto do Unity em que trabalhei há mais de dez anos.

Eu ainda não sabia a diferença entre objetos e componentes do jogo.

Mas não importava, eu ainda criava jogos.

imagem

Uma hierarquia caótica de cena da unidade me era familiar? Na verdade sim, porque às vezes era muito pior. No entanto, é curioso que, na maioria das vezes, esse tipo de hierarquia possa ser dispensado. Mas você vai sofrer. Você terá que pagar por isso mais tarde.

Felizmente, antes de começar a desenvolver jogos profissionalmente, aprendi a apreciar hierarquias mais estruturadas.

A estrutura de qualidade da hierarquia da cena pode ser sua melhor amiga. A estrutura simplifica bastante o desenvolvimento e a colaboração.

Não precisa ser perfeito, o que quer que isso signifique. É o suficiente para ela ser boa. Mas tenha cuidado. Isso é importante.

Uma hierarquia desordenada da cena é perigosa, pois causará problemas, pois é muito improvável que você observe diretamente seus efeitos colaterais.

Um fantasma assustador irá assombrá-lo, atrasá-lo e puxá-lo para trás. Às vezes você vai olhar para trás, mas não haverá nada para trás. Portanto, você se acostumará a se mover lentamente.

Ao longo dos anos, aprendi a diagnosticar esses efeitos colaterais. O principal problema é que os efeitos colaterais de uma hierarquia caótica não são tão fáceis de rastrear.

Você verá o criador de perfil, mas não saberá o que os marcadores significam. Seus nomes costumam ser misteriosos ... que segredos eles mantêm? Só há uma coisa a ter certeza: os marcadores misteriosos nos dizem algo que vale a pena explorar.

Quando discutimos a melhoria da estrutura da cena, geralmente queremos dizer melhorar a compreensibilidade e reduzir os custos de suporte. Mas todo mundo esquece o desempenho.

Vamos analisar a hierarquia de cenas mostrada acima. Ele contém 2.000 esferas rotativas aninhadas uma na outra .

O que o profiler dirá sobre isso? Vamos ver

imagem

Otimização da hierarquia da cena da unidade: visão geral do criador de perfil de hierarquia

Desempenho muito baixo para uma pré-fabricação simples e um script de rotação aplicado a uma esfera regular. Como você pode ver, os Physics.SyncColliderTransform e UpdateRendererBoundingVolumes ocupam uma grande parte do orçamento do período. Mas não vamos terminar a análise disso, porque estou muito curioso sobre este caso.

Vamos nos aprofundar.


Detalhes do Hierarchy Profiler

Aqui está a resposta para a pergunta do artigo.

Hierarquias não otimizadas causam dois grandes problemas no Unity.

  • Hierarquias profundas impedem que o sistema de trabalho funcione eficientemente em paralelo
  • Hierarquias aninhadas acionam gargalos em alguns subsistemas do Unity.

Não se esqueça, porque se aplica a todos os tipos de objetos dinâmicos e, especialmente, a interfaces de usuário.

Para referência: eu trabalho no Threadripper com 16 núcleos físicos e 32 threads. Você sabe quantos deles trabalham efetivamente neste projeto? Apenas um.

Escusado será dizer que o desempenho do jogo sofre com isso. E se você tentar corrigir a situação entendendo todos esses nomes misteriosos, envelheça prematuramente.

O que um desenvolvedor de nível 2 faria com 2.000 objetos?

Desenvolvedor de nível 2: Hierarquia de cena de unidade otimizada


Um desenvolvedor Unity de nível 2 sabe que as transformações filho têm um preço. Ele também sabe que o preço, neste caso, são os milissegundos de tempo da CPU. Ou as horas de trabalho extra gastas pelo desenvolvedor para resolver esse problema.

Pergunte a si mesmo: o orçamento de tempo da CPU é suficiente para pagar por uma hierarquia tão extensa?

De que área do seu jogo você tira esses milissegundos?

Isso terá que reduzir o número de partículas bonitas? Ou o número de monstros que um jogador deve enfrentar? Espero que você não precise fazer nada disso, mas melhor ...

Crie hierarquias de cena eficazes e destrua sub-ótimas.

A razão pela qual o aninhamento complexo de objetos filho rouba recursos de jogo é simples: cada mudança na transformação afeta os filhos e, possivelmente, os pais com os irmãos.

Quando você altera a posição, rotação ou escala de um objeto, o Unity reconta muitos aspectos. O mecanismo faz isso por conta própria, para que você possa se concentrar no jogo. Isso é ótimo, mas se você não souber, o preço pode se tornar astronômico.

Qual é a solução? Mantenha as coisas simples e siga as regras de ouro de uma hierarquia limpa da cena do Unity:

  • Não mais que 50 filhos no total por objeto de jogo
  • Não mais que 4 níveis de aninhamento em qualquer objeto do jogo.

Isso não é fácil? O desenvolvedor de nível 2 cria o máximo possível de hierarquias planas de cenas de unidade.

Dê uma olhada na imagem abaixo. O mesmo número de objetos, mas desta vez estruturado em uma hierarquia plana.


As economias são enormes.

Mas é mais fácil falar do que fazer, não é? A separação e a destruição das relações entre os objetos são trabalhosas, propensas a erros e demoradas.

O que um desenvolvedor de nível 3 faria?

Desenvolvedor de nível 3: Ferramenta de hierarquia da FAP


Um bom desenvolvedor do Unity faz o trabalho. Um grande desenvolvedor do Unity faz o trabalho com mais rapidez e precisão. Mas como ele consegue? Com a ajuda de ferramentas. Como a única hierarquia barata é a hierarquia vazia, para avaliar o jogo, é necessário responder às seguintes perguntas ...

Quão complexas são suas hierarquias?

Essa pergunta pode ser respondida analisando metodicamente hierarquias e atribuindo a elas uma classificação numérica.


Que fórmulas matemáticas são necessárias para calcular esta estimativa? Felizmente, nenhum. Eu fiz tudo por você. Eu escrevi uma ferramenta de protótipo para analisar e reconhecer automaticamente gargalos em sua hierarquia com base nas regras de ouro acima.

Chamei isso Fabulous Advanced Profiling Hierarchy Tool . Inicie o jogo. Chegue a um momento interessante. Abra a ferramenta e deixe fazer o resto.


A ferramenta fornecerá uma classificação inteira. Depois de saber a pontuação, você saberá o que fazer ... Ou não?

Porque eu lhe dou não apenas essa ferramenta, mas também um script adicional que permite fortalecer sua capacidade de eliminar problemas com hierarquias. Eu lhe dou o poder de um simples script DetachGameObject.cs .

É raro encontrar um script de 27 linhas, o que permite melhorar o desempenho em tão pouco tempo. Seu trabalho é simples: durante a execução do programa, ele move objetos de jogo pesados ​​e incorporados para a raiz da hierarquia de cenas. Por isso, você tira proveito das hierarquias estruturadas em tempo de design e obtém enormes ganhos de desempenho em tempo de execução .

Há uma alta probabilidade de que você possa fazer isso em grande parte da sua hierarquia, que para a estruturação possui muitos aninhamentos.

Você pode baixar a ferramenta e o script no final do artigo original .

Source: https://habr.com/ru/post/pt481510/


All Articles