O que você está procurando?
Engine & platform

Criação de perfil no Unity 2021 LTS: O que, quando e como

THOMAS KROGH-JACOBSEN / UNITY TECHNOLOGIESProduct Marketing Core Tech
Jun 1, 2022|23 Min
Criação de perfil no Unity 2021 LTS: O que, quando e como
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.

O desenvolvimento de experiência com o conjunto de ferramentas de criação de perfil do Unity é uma das habilidades mais úteis que você pode adicionar à sua caixa de ferramentas de desenvolvimento de jogos. A criação de perfis minuciosa pode aumentar enormemente o desempenho do seu jogo, por isso queremos ajudá-lo a começar com dicas importantes do nosso recém-lançado e-book, Ultimate guide to profiling Unity games.

Todo criador de jogos sabe que o desempenho suave é essencial para criar experiências de jogo imersivas e, para isso, é necessário criar um perfil para o seu jogo. Você não só precisa saber quais ferramentas usar e como, mas também quando usá-las.

Nosso guia de mais de 70 páginas para criação de perfis avançados, que acaba de sair da gráfica, foi criado em conjunto com especialistas internos e externos. Ele compila conselhos e conhecimentos sobre como criar o perfil de um aplicativo no Unity e identificar gargalos de desempenho, entre outras práticas recomendadas.

Vamos dar uma olhada em algumas dicas úteis do e-book.

Quando criar um perfil

A criação de perfis é como um trabalho de detetive, desvendando os mistérios do motivo pelo qual o desempenho do seu aplicativo está diminuindo ou por que o código está alocando memória em excesso.

As ferramentas de criação de perfil ajudam você a entender o que está acontecendo "sob o capô" do seu projeto Unity. Mas não espere que problemas significativos de desempenho comecem a aparecer para usar sua caixa de ferramentas de detetive.

Os melhores ganhos com a criação de perfis são obtidos quando se planeja no início do ciclo de vida de desenvolvimento do projeto, em vez de apenas antes de enviar o jogo. Trata-se de um processo contínuo, proativo e iterativo. Ao traçar o perfil com antecedência e frequência, você e sua equipe podem entender e estabelecer uma "assinatura de desempenho" para o projeto. Se o desempenho cair drasticamente, por exemplo, você poderá identificar facilmente quando as coisas estiverem erradas e solucionar o problema rapidamente.

Você também pode fazer comparações de desempenho antes e depois em partes menores, usando um procedimento simples de três pontos: Primeiro, estabeleça uma linha de base por meio da criação de perfis antes de fazer grandes alterações. Em seguida, crie um perfil durante o desenvolvimento para acompanhar o desempenho e o orçamento e, por fim, crie um perfil após a implementação das alterações para verificar se elas surtiram o efeito desejado.

Você deve procurar criar o perfil de uma compilação de desenvolvimento do seu jogo, em vez de criá-lo a partir do Unity Editor. Há dois motivos para isso:

Os dados sobre desempenho e uso de memória das compilações de desenvolvimento autônomo são muito mais precisos em comparação com os resultados da criação de perfil de um jogo no Editor. Isso se deve ao fato de a janela do Profiler registrar dados do próprio Editor, o que pode distorcer os resultados.

Alguns problemas de desempenho só aparecerão quando o jogo estiver sendo executado no hardware ou nos sistemas operacionais de destino, o que você não perceberá se traçar o perfil exclusivamente no Editor.

As ferramentas à sua disposição

Os resultados mais precisos da criação de perfil ocorrem por meio da execução e da criação de perfil em dispositivos de destino e do uso de ferramentas específicas da plataforma para analisar as características de hardware de cada plataforma de destino.

Embora o Unity venha com uma série de ferramentas de criação de perfil gratuitas e poderosas para analisar e otimizar seu código, tanto no Editor quanto no hardware, também há várias ferramentas de criação de perfil nativas excelentes projetadas para cada plataforma, como as disponíveis na Arm, Apple, Sony e Microsoft. O uso de uma combinação oferece uma visão mais holística do desempenho dos aplicativos em todos os dispositivos de destino.

Para obter uma visão geral completa das ferramentas disponíveis, consulte a página de ferramentas de criação de perfil aqui.

As ferramentas de criação de perfil do Unity estão disponíveis no Editor e no Package Manager. Cada ferramenta é especializada em traçar o perfil de várias partes do processo (um fluxo de trabalho holístico da "soma de todas as partes"). Familiarize-se com os seguintes profilers para que eles se tornem parte de sua caixa de ferramentas diária:

  • O Unity Profiler é onde você deve começar e passar a maior parte do seu tempo. Ele mede o desempenho do Unity Editor, seu aplicativo no modo Play e se conecta ao dispositivo que está executando seu aplicativo no modo Development. O Unity Profiler reúne e exibe dados sobre o desempenho do seu aplicativo, como a quantidade de tempo de CPU que está sendo usada para diferentes tarefas, desde áudio e física até renderização e animação. Para começar, confira este curso sobre criação de perfis.
  • O Memory Profiler fornece uma análise aprofundada do desempenho da memória para identificar onde é possível reduzir o uso de memória em partes do projeto e do Editor. O Memory Profiler está atualmente em visualização, mas espera-se que seja verificado no Unity 2022 LTS.
  • O Profile Analyzer agrega e visualiza dados de quadros e marcadores de um conjunto de quadros do Unity Profiler para ajudá-lo a examinar seu comportamento em muitos quadros (complementando a análise de quadro único já disponível no Unity Profiler). Ele também permite que você compare dois conjuntos de dados de criação de perfil para determinar como as alterações afetam o desempenho do aplicativo.
  • O depurador de quadros permite congelar a reprodução de um jogo em execução em um quadro específico e, em seguida, visualizar as chamadas de desenho individuais usadas para renderizar esse quadro. Além de listar as chamadas de desenho, o depurador permite percorrê-las uma de cada vez, para que você possa ver como a cena é construída a partir de seus elementos gráficos.
  • O pacote Profiling Core fornece APIs para adicionar informações contextuais às capturas do Unity Profiler.
Como usar as ferramentas

Steve McGreal, engenheiro sênior da Unity e coautor do nosso e-book sobre perfis avançados, elaborou a seguinte visão geral de alto nível. Fique à vontade para usá-la como folha de referência.

Embora a explicação detalhada sobre como usar as ferramentas possa ser encontrada no e-book, este fluxograma ilustra três observações principais a serem consideradas em seu fluxo de trabalho:

Fluxograma de como usar o Profiler para identificar onde concentrar os esforços de otimização
Como usar o Profiler para identificar onde concentrar os esforços de otimização

Faça o download da versão em PDF para impressão dessa tabela aqui. Para obter mais informações, consulte os recursos vinculados sobre como usar cada uma das ferramentas de criação de perfil no final desta postagem.

Você está dentro do orçamento?

Uma maneira comum de os jogadores medirem o desempenho é por meio da taxa de quadros, ou quadros por segundo. No entanto, é recomendável que você use o tempo do quadro em milissegundos.

Por exemplo, você pode ter um jogo que renderiza 59 quadros em 0,75 segundo no tempo de execução, com o próximo quadro levando 0,25 segundo para ser renderizado. A taxa de quadros média de 60 fps parece boa, mas, na realidade, os jogadores perceberão um efeito de gagueira, pois o último quadro leva um quarto de segundo para ser renderizado.

Procure obter um orçamento de tempo específico por quadro ao criar perfis e otimizar seu jogo, pois isso é fundamental para criar uma experiência de jogador suave e consistente. Cada quadro terá um orçamento de tempo com base em sua meta de fps. Um aplicativo que visa 30 fps deve sempre levar menos de 33,33 ms por quadro (1000 ms / 30 fps). Da mesma forma, uma meta de 60 fps deixa 16,66 ms por quadro.

A maioria dos jogos modernos de console e PC tem como objetivo atingir uma taxa de quadros de 60 fps ou mais. Nos jogos de RV, é realmente mais importante evitar uma taxa de quadros regularmente alta, pois isso pode causar náusea ou desconforto aos jogadores. Os jogos para celular também podem exigir orçamentos de quadros restritivos para evitar o superaquecimento dos dispositivos em que são executados. Por exemplo, um jogo para celular pode ter como meta 30 fps com um orçamento de quadros de apenas 21-22 ms para que a CPU e a GPU esfriem entre os quadros.

Use o Unity Profiler para ver se você está dentro do orçamento de estrutura. Abaixo está uma imagem de uma captura de perfil de um jogo para celular Unity com perfil e otimização contínuos. O jogo tem como meta 60 fps em telefones celulares de alta especificação e 30 fps em telefones de média/baixa especificação, como o desta captura:

Instantâneo da taxa de quadros do Profiler
Instantâneo da taxa de quadros do Profiler

Esse é um jogo que funciona confortavelmente dentro do limite de quadros de ~22 ms necessário para 30 fps sem superaquecimento. Observe o WaitForTargetfps preenchendo o tempo do thread principal, até o VSync e os tempos ociosos em cinza no thread de renderização e no thread de trabalho. Além disso, observe o intervalo VBlank observando os tempos finais do Gfx. A apresentação quadro a quadro desenha uma escala de tempo na área Timeline (Linha do tempo) ou na régua Time (Tempo) na parte superior para medir de um quadro a outro.

Se você estiver dentro do orçamento do quadro, incluindo quaisquer ajustes feitos no orçamento para levar em conta o uso da bateria e o estrangulamento térmico, então você concluiu com êxito a criação de perfil de desempenho até a próxima vez - parabéns! Agora, observe o uso da memória para ver se também está dentro do orçamento.

Dito isso, se o seu jogo não estiver dentro do orçamento de quadros, a próxima etapa é detectar o gargalo. Em outras palavras, descubra se a CPU ou a GPU está demorando mais. Se for a CPU, determine qual thread é o mais ocupado - é aí que está o gargalo.

O objetivo da criação de perfis é identificar os gargalos como alvos de otimização. Se você confiar em suposições, poderá acabar otimizando partes do jogo que não são gargalos, resultando em pouca ou nenhuma melhoria. Algumas "otimizações" podem até piorar o desempenho geral do jogo.

Você está vinculado à thread principal da CPU?

O thread principal é onde toda a lógica e os scripts do jogo executam seu trabalho por padrão; onde recursos e sistemas como física, animação, interface do usuário e renderização são executados.

Veja na captura de tela abaixo um exemplo de como é um projeto vinculado à thread principal:

Captura de um projeto que é vinculado à thread principal

Embora os threads de renderização e de trabalho se pareçam com o exemplo anterior que está dentro do orçamento do quadro, o thread principal aqui está claramente ocupado com o trabalho durante todo o quadro. Mesmo que você leve em conta a pequena quantidade de sobrecarga do Profiler no final do quadro, o thread principal fica ocupado por mais de 45 ms, o que significa que esse projeto atinge taxas de quadros inferiores a 22 fps. Não há nenhum marcador que mostre a thread principal esperando o VSync ociosamente; ela está ocupada durante todo o quadro.

A próxima etapa da investigação é identificar as partes do quadro que levam mais tempo e identificar as causas subjacentes. Use o Unity Profiler e o Profile Analyzer para avaliar e lidar com os maiores custos. Os gargalos comuns geralmente derivam da física, dos scripts não otimizados, do coletor de lixo (GC), da animação, das câmeras e da interface do usuário. Se a origem do problema não for imediatamente óbvia, tente ativar o Deep Profiling, Call Stacks ou usar um profiler de CPU nativo.

Em nosso guia de otimização de desempenho de 95 páginas, coletamos uma lista de armadilhas comuns que você pode encontrar e para as quais pode se preparar.

Você está vinculado ao thread de renderização da CPU?

Durante o processo de renderização, o thread principal examina a cena e executa a seleção de câmeras, a classificação de profundidade e o agrupamento de chamadas de desenho para compilar uma lista de itens a serem renderizados. Essa lista é passada para o thread de renderização, que a traduz da representação independente de plataforma interna do Unity para as chamadas da API de gráficos necessárias para instruir a GPU em uma plataforma específica.

Na captura do Profiler mostrada abaixo, você pode ver que o thread principal aguarda o thread de renderização antes de começar a renderizar o quadro atual, conforme indicado pelo marcador Gfx.WaitForPresentOnGfxThread.

Um cenário de renderização thread-bound no Profiler
Um cenário de renderização thread-bound no Profiler

O thread de renderização ainda envia comandos de chamada de desenho do quadro anterior, mas não está pronto para aceitar novas chamadas de desenho do thread principal. O thread de renderização gasta tempo em Camera.Render.

O módulo Rendering Profiler compartilha uma visão geral do número de lotes de chamadas de desenho e de chamadas SetPass para cada quadro. A melhor ferramenta para investigar quais lotes de chamada de desenho seus problemas de thread de renderização para a GPU é o Frame Debugger. As causas comuns de gargalos de thread de renderização incluem lotes de chamadas de desenho ruins, várias câmeras ativas na cena e seleção ineficiente de câmeras.

Você está limitado pelos threads de trabalho da CPU?

Estar vinculado a threads de CPU, além dos threads principais ou de renderização, não é um problema tão comum, mas pode surgir em projetos que usam a pilha de tecnologia orientada a dados (DOTS), especialmente se o trabalho for transferido do thread principal para threads de trabalho usando o sistema de trabalho C#.

Aqui está uma captura do modo Play no Editor que destaca um projeto DOTS executando uma simulação de fluido de partículas na CPU:

Um projeto baseado em DOTS, com muita simulação e vinculado a threads de trabalho

Como você pode ver, os threads de trabalho estão lotados de trabalhos. Isso sugere que uma grande quantidade de trabalho está sendo transferida para fora do thread principal. Observe que o tempo de quadro de 48,14 ms e o marcador cinza WaitForJobGroupID de 35,57 ms no thread principal indicam que os threads de trabalho estão fazendo mais trabalho do que pode ser realisticamente alcançado em um único quadro nessa CPU.

WaitForJobGroupID mostra que o thread principal programou trabalhos para serem executados de forma assíncrona em threads de trabalho, mas precisa dos resultados desses trabalhos antes que os threads de trabalho terminem de executá-los. Os marcadores azuis do Profiler abaixo de WaitForJobGroupID representam o thread principal executando trabalhos enquanto espera, em uma tentativa de fazer com que os trabalhos terminem mais cedo.

Os trabalhos em seu projeto podem não ser tão paralelos como neste exemplo. Talvez você tenha apenas um trabalho longo em execução em um único thread de trabalho. Não há problema, desde que o tempo entre o agendamento do trabalho e o momento em que ele precisa ser concluído seja longo o suficiente para que o trabalho seja executado. Se não for, você verá o thread principal parado, aguardando a conclusão do trabalho, como na captura de tela acima.

Você pode usar o recurso Flow Events na visualização Timeline do módulo CPU Usage Profiler para ver quando os trabalhos são agendados e quando seus resultados são esperados pelo thread principal. Para obter mais informações sobre como escrever um código DOTS eficiente, consulte nossas práticas recomendadas para DOTS.

Você é limitado por GPU?

Você pode notar que seu thread principal passa algum tempo esperando pelo thread de renderização (conforme exibido pelos marcadores do Profiler, como Gfx.WaitForPresentOnGfxThread). Mas, ao mesmo tempo, seu thread de renderização pode exibir marcadores como Gfx.PresentFrame ou <GraphicsAPIName>.WaitForLastPresent. Isso significa que seu aplicativo está vinculado à GPU. Portanto, você precisará concentrar seus esforços de otimização nos gargalos da GPU para melhorar o desempenho geral.

A captura a seguir foi feita em um Samsung Galaxy S7 usando a API gráfica Vulkan. Embora parte do tempo gasto em Gfx.PresentFrame nesse exemplo possa estar relacionado à espera pelo VSync, a duração extrema desse marcador do Profiler prova que a maior parte do tempo é gasta esperando que a GPU termine de renderizar o quadro anterior.

Uma captura de um jogo para celular vinculado à GPU
Uma captura de um jogo para celular vinculado à GPU

Se o seu aplicativo parecer estar vinculado à GPU, você poderá usar o depurador de quadros para obter uma rápida compreensão dos lotes de draw call que estão sendo enviados à GPU. No entanto, essa ferramenta não pode apresentar nenhuma informação específica sobre o tempo da GPU. Ela apenas revela como a cena é construída.

Para investigar cuidadosamente a causa dos gargalos da GPU, examine uma captura de GPU de um Profiler de GPU adequado. A ferramenta que você usa depende do hardware de destino e da API gráfica escolhida.

As causas comuns do baixo desempenho da GPU incluem shaders ineficientes, efeitos de pós-processamento caros, overdraw transparente (geralmente de efeitos de partículas ou UI), texturas grandes ou não compactadas, malhas com contagens de polígonos excessivamente altas e resoluções de saída excessivas (ou seja, renderização em 4K).

Obtenha o e-book gratuito
Uma promoção de um livro eletrônico de perfis
O e-book "Ultimate guide to profiling unity games" (Guia definitivo para criação de perfis de jogos em unidade)

A otimização do desempenho e a criação de perfis são tópicos importantes. Se estiver procurando mais informações, confira nosso e-book lançado recentemente, Guia definitivo para criação de perfil em jogos Unity. Você terá mais de 80 páginas de dicas e truques criados em parceria com vários especialistas, incluindo os da nossa equipe de serviços de suporte integrado.

Na verdade, alguns desses especialistas também ajudaram a elaborar nosso guia de 100 páginas sobre otimização de desempenho para dispositivos móveis e PC/console, repleto de dicas práticas sobre como evitar a criação de gargalos em primeiro lugar. Para obter recursos adicionais, dê uma olhada em nossa série de publicações anteriores do blog sobre física, interface do usuário e configurações de áudio, gráficos e ativos em dispositivos móveis ou console e arquitetura de memória e código.

Se estiver interessado em saber como sua equipe pode obter acesso direto a engenheiros, consultoria especializada e orientação de projetos, leia os Planos de sucesso da Unity aqui.

Webinar de criação de perfil
Modelo 3D com a figura do robô à direita

Assista ao nosso novo webinar Ultimate profiling tips com especialistas da SYBO Games, Arm e Unity para obter dicas sobre como identificar desafios comuns de desempenho em jogos para dispositivos móveis, usando ferramentas de criação de perfil nativas e do Unity.

Este webinar abordará:

  • Principais considerações para criar um código enxuto e de alto desempenho e otimizar o uso da memória para obter um desempenho suave em dispositivos de baixo e alto desempenho
  • Gerenciando o controle térmico para conservar os preciosos ciclos da bateria em dispositivos móveis
  • Estratégias de perfil em todos os estágios do desenvolvimento do jogo e como testá-las para criar uma metodologia sólida
  • Insights de especialistas sobre a criação de perfis do Android

Participe da nossa mesa redonda e das perguntas e respostas ao vivo em 14 de junho de 2022, às 11h ET / 8h PT.

Não encontrou o que estava procurando?

Queremos ajudá-lo a tirar o máximo proveito de seus aplicativos Unity. Se houver algum tópico de otimização que você gostaria que explorássemos mais, informe-nos nos fóruns. Também gostaríamos de saber quais são os formatos de sua preferência para que possamos aprimorar nossos e-books e outros materiais de aprendizagem.