O desempenho descreve a fluidez com que o projeto é executado no hardware alvo. A Unreal Engine simula o tempo real desenhando ou renderizando repetidamente uma imagem do mundo do jogo na tela. Como um folioscópio, a engine exibe quadros em rápida sucessão, criando o efeito de movimento. O desempenho dos quadros renderizados pode ser medido de duas maneiras: por quadros por segundo e pelo tempo de quadro. Eles podem ajudar a entender o desempenho do aplicativo para atingir um determinado número de quadros por segundo e onde o tempo nesses quadros está sendo gasto, que é medido em milissegundos.
Quanto mais quadros você renderizar em um segundo, mais suave será o movimento para o usuário e mais será a resposta do aplicativo. Geralmente, as aplicações terão como alvo 30, 60 e 120 quadros por segundo ao considerar seu orçamento de desempenho e hardware. Para fornecer a melhor experiência de usuário possível, você deseja uma taxa de quadros mais alta, mas também consistente. Este documento fornece uma introdução sobre o desempenho de renderização, bem como um guia de diversas ferramentas para analisar e gerenciar o desempenho de renderização do aplicativo da Unreal Engine.
Como entender o desempenho
Muito da lógica na Unreal Engine depende de duas coisas:
O que está acontecendo no quadro atual.
Quanto tempo se passou desde o quadro anterior.
Como alguns exemplos, conforme um quadro é renderizado, pode ocorrer o seguinte:
O usuário pode mover um personagem ou veículo.
O usuário pode interagir com um objeto.
Entidades controladas por IA podem se mover ou realizar diversas ações.
A IU do usuário pode mudar.
Um objeto na tela pode avançar em sua animação ou mesclar várias animações.
As simulações de física podem alterar a posição ou a rotação de objetos de física.
Cada uma dessas operações adiciona um trabalho adicional que o computador tem que fazer enquanto desenha cada quadro. Além disso, é possível tornar o processo de desenho de cada quadro mais ou menos complexo com diversas configurações de renderização. Alguns possíveis ajustes incluem:
Aumentar o nível de detalhe de objetos e texturas, o que faz o computador levar mais tempo calculando a cor final de cada pixel relacionado.
Adicione efeitos de pós-processamento, que acrescentam etapas extras que devem ser executadas na imagem em vários estágios de renderização.
Use iluminação e sombreamento de fidelidade mais alta, o que torna as cenas mais realistas, mas também aumenta a complexidade dos cálculos de iluminação.
Quanto mais coisas você instruir o aplicativo a fazer em cada quadro, mais tempo levará para renderizar um único quadro. Se os quadros levarem um tempo particularmente longo para serem renderizados, a taxa de quadros geral diminuirá, fazendo com que o aplicativo pareça menos suave e responsivo.
Medição de quadros por segundo e tempo do quadro
Para monitorar os quadros por segundo e o tempo do quadro, habilite a exibição dessas medidas na janela de visualização. No menu de hambúrguer da janela de visualização, habilite Mostrar FPS, clique em Estatísticas > Engine e habilite os FPS e a Unidade.
Limitações de hardware e quedas na taxa de quadros
Uma taxa de quadros lenta é o resultado de muito processamento ocorrendo durante um único quadro, geralmente por parte de operações que se repetem toda vez que um quadro é desenhado na tela. Você pode imaginar cada quadro renderizado como um trem programado para sair da estação, seguido por outro trem alguns milissegundos depois. Com este trem, no entanto, todos os passageiros que compraram uma passagem devem embarcar nele antes que ele possa partir. Cada operação realizada durante esse quadro, seja na jogabilidade ou na lógica de renderização, é como um outro passageiro que precisa ser embarcado.
Quando você gasta muito tempo processando um único quadro, é como se o trem parasse, pois você está tentando embarcar muitos passageiros que ainda não embarcaram. Isso impede que o próximo trem possa vir. O resultado na tela é uma queda na taxa de quadros. Elas podem ocorrer brevemente, causando problemas em que a tela trava em um quadro por tempo demais, ou podem ocorrer de forma consistente a cada quadro, resultando em uma taxa de quadros baixa em geral.
Qualquer um dos seguintes recursos de computação pode causar um gargalo:
CPU: a unidade de processamento central (CPU) do seu computador está executando muitas operações em uma ou mais threads durante um único quadro. Isso indica que a IU, a lógica de jogabilidade ou outra lógica central do aplicativo não está sendo executada de forma eficiente ou que você está realizando muitas dessas operações durante um único quadro.
GPU: a unidade de processamento gráfico (GPU) do computador está executando muitas operações durante um único quadro. Isso indica que a renderização ou o pós-processamento do jogo estão sendo executados de forma ineficiente, ou que a GPU está sobrecarregada com muitas operações.
Tamanho da memória (RAM): a memória de acesso aleatório (RAM) do seu computador está cheia, impedindo que as operações sejam concluídas até que seja esvaziada. Isso tende a resultar em uma exceção de falta de memória e uma falha, em vez de um problema de desempenho. Alguns sistemas, como coleta de lixo ou transmissão de ativos, são elásticos, o que introduz um atraso dinâmico no trabalho de limpeza. Quando a RAM fica cheia, esses sistemas precisam realizar operações de limpeza e repreenchimento com mais frequência, o que aumenta a carga de trabalho da CPU.
Velocidade da memória (RAM): as CPUs operam em pequenas partes de dados fisicamente colocados com os núcleos, trocando essas partes de dados com a RAM conforme necessário. Essas operações podem ocorrer muito mais rapidamente do que a troca de partes entre a CPU e a RAM (por exemplo, uma CPU pode realizar 20 manipulações de dados carregados no mesmo tempo necessário para carregar uma nova parte de dados). Quanto mais lenta for a RAM e quanto mais frequentemente a lógica precisar alternar entre cada parte contínua de memória com o qual ela precisa interagir, mais tempo os núcleos da CPU gastarão sem fazer nada, esperando o barramento de memória.
Memória da GPU: a memória RAM da sua GPU está cheia, impedindo que as operações sejam concluídas até que seja limpa. Isso geralmente é resultado da sobrecarga da memória de textura, pois as texturas ocupam muito espaço.
Acesso à unidade: os objetos precisam ser carregados da sua unidade ou de outro dispositivo de armazenamento antes de serem adicionados à memória. Se você precisar acessar o dispositivo de armazenamento com muita frequência, as operações não serão concluídas.
Banda de rede: a conexão do seu computador com a Internet está lenta ou não é confiável, resultando em mais trabalho da CPU em cada quadro gasto para reunir ou reenviar pacotes de confiança, em explosões de trabalho que poderiam ter sido distribuídas em muitos quadros ou simplesmente em elementos visuais instáveis, apesar da falta de gargalos locais de desempenho.
Vínculo com a CPU vs. Vínculo com a GPU
Descrevemos os aplicativos como sendo vinculados à CPU ou à GPU, dependendo de qual delas tiver a menor margem de desempenho. Se for mais provável que a CPU cause gargalos, o vínculo será com a CPU. Se a GPU tiver mais chances de causar gargalos, o vínculo será com a GPU. Se o VSync estiver habilitado e a CPU e a GPU forem capazes de produzir quadros mais rapidamente do que o monitor é capaz de exibi-los, o aplicativo será vinculado à exibição. Isso geralmente dependerá da plataforma de destino e dos recursos dela.
Picos de processamento
Um pico de processamento refere-se a um aumento breve e repentino no tempo gasto pela CPU ou GPU durante um quadro.
Operações caras vs. Operações baratas
Em termos gerais, uma operação cara requer uma quantidade relativamente grande de recursos de computação para ser executada. Isso pode significar maior tempo de processamento ou maior quantidade de memória. Operações baratas não exigem muitos recursos de computação. Esses termos costumam ser usados para comparar processos que realizam operações semelhantes.
Memória em aplicações em tempo real
Tudo o que você pode processar ou renderizar fica na memória do seu aplicativo, com exceções para algumas coisas, como geometria virtual no Nanite, que é transmissão diretamente de um disco rígido de estado sólido (SSD). Uma maneira fácil de pensar nisso é: se você pode ver e mover alguma coisa na tela, uma cópia dela existe na memória do seu computador, e os recursos de renderização do objeto, como texturas, shaders e malhas, existem na memória da sua GPU.
Desempenho e uso de energia
O uso de energia varia de acordo com a arquitetura do hardware, mas, em geral, executar uma carga de processamento maior e renderizar mais quadros por segundo contribuem para um maior consumo de energia. Nas configurações Móvel e IHM, o consumo de energia do dispositivo é uma grande preocupação. Portanto, recomendamos que você faça o aplicativo rodar da maneira mais eficiente possível. Os jogadores podem avaliar negativamente jogos que usam a bateria do smartphone mais rápido do que outros jogos. Além disso, fazer com que o telefone aqueça usando mais energia pode ativar a limitação térmica, que força a CPU a rodar mais devagar até que o telefone esfrie novamente.
Ferramentas de geração de perfis
A geração de perfis é o ato de analisar o uso que sua aplicação faz dos recursos do sistema, como processamento de CPU ou GPU, uso de memória ou largura de banda de rede. A Unreal Engine fornece vários conjuntos de ferramentas de geração de perfis:
Ferramenta | Descrição |
Unreal Insights | Grave e revise dados de desempenho quadro a quadro. |
Comandos de estatísticas | Exiba estatísticas de desempenho na tela. |
Para obter informações sobre como usar o Unreal Insights com dispositivos Android, confira a página Unreal Insights em dispositivos Android.
Você também pode usar uma ferramenta de terceiros para geração de perfis, incluindo as seguintes ferramentas:
Ferramenta | Descrição |
Depure capturas de quadro único dos gráficos do seu aplicativo. | |
Criar um perfil de sistema completo e dados de rastreamento. |
Lembre-se de que a geração de perfis usa a mesma CPU, RAM e disco que o jogo. Ao executar o jogo com um gerador de perfis anexado, o desempenho ficará um pouco pior. No entanto, isso pode ser bom, pois resulta em um cenário em que parecer atingir suas metas de desempenho significa, na verdade, que você as superou, deixando alguns recursos livres com os quais o jogo pode continuar funcionando normalmente em casos de variabilidade imprevista do sistema.
Unreal Insights
O Unreal Insights é um conjunto robusto e poderoso de ferramentas de geração de perfis disponível na Unreal Engine, oferecendo ferramentas para analisar threads individuais, uso de memória e largura de banda de rede. Você pode ver quantos milissegundos cada operação individual leva na CPU ou GPU, quanta memória está sendo alocada nos insights de memória e um detalhamento da telemetria e dados de pacote nos insights de memória. Também existem modos especializados para gráficos de tarefas de geração de perfis, interruptores de contexto e elementos de IU do Slate, que podem ajudar a realizar uma análise aprofundada do desempenho do seu aplicativo.
Comandos de estatísticas
As estatísticas se referem a uma série de comandos do console que você pode usar em um aplicativo da UE em execução para gerar estatísticas na tela. Existem comandos de estatísticas para uma grande variedade de operações e sistemas, incluindo, entre outros:
Rastreamento de memória
Carga de GPU e CPU
Marcas de jogabilidade
IU
Animações
Embora usar comandos de estatísticas não seja tão robusto quanto trabalhar com Unreal Insights ou RenderDoc, é a maneira mais rápida de obter dados sobre o que está acontecendo em seu aplicativo enquanto ele estiver sendo executado ou testado.
Para obter uma lista completa de comandos de estatísticas, confira a página Comandos de estatísticas.
RenderDoc
O RenderDoc é um depurador gráfico de código aberto que pode ser anexado à UE e fornecer saída de capturas de quadro único. Ele pode realizar muitas operações, incluindo as seguintes:
Inspecionar texturas, modelos ou shaders.
Mostrar eventos de desenho individuais.
Fornecer uma análise detalhada do estado do pipeline do aplicativo no momento em que você captura um quadro.
Enquanto o Unreal Insights pode dar uma ideia geral de quais operações de renderização estão usando a maior quantidade de recursos de processamento e memória, o RenderDoc é mais adequado para obter um diagnóstico detalhado das operações de renderização e identificar os locais exatos onde os bugs estão ocorrendo. Por exemplo, se vir artefatos de renderização no seu dispositivo de destino, mas não no Jogar no Editor, você pode usar o RenderDoc para capturar um quadro em ambos, comparar seus dados e ver o que está acontecendo de diferente entre eles de modo a causar o surgimento dos artefatos.
Ferramentas de configuração de desempenho
Muitas instruções para ajustar as configurações de renderização e escalabilidade do projeto se referem aos comandos e variáveis do console. Esta seção fornece uma introdução sobre como usá-los e recursos para entendê-los em detalhes.
Comandos e variáveis do console
O console é uma linha de comando dentro da Unreal Engine que você pode usar para alterar configurações, executar comandos de depurar e obter informações durante a execução do jogo. Você pode usar comandos do console no Unreal Editor ou em uma versão de desenvolvedor ou de depuração de um projeto empacotado pressionando a tecla til (~). Isso abre a linha de comando e solicita que você digite o comando.
Os comandos na UE são compatíveis com uma funcionalidade de pesquisa/preenchimento automático, então você pode digitar um comando parcial para restringir a lista dos possíveis comandos que você está procurando. Por exemplo, se você digitar "Stat", será exibida uma lista de comandos de estatísticas.
Variáveis de console, ou CVars, são variáveis de configuração que você pode editar usando comandos do console. Para alterar CVars diretamente no console, digite o caminho de configuração da variável e forneça o valor que deseja definir para ela. Por exemplo:
r.TemporalAA.Quality 0O comando acima define a CVar r.TemporalAA.Quality como 0, desativando efetivamente o antisserrilhado temporal. Isso faz com que as bordas dos objetos pareçam mais rígidas e pixeladas.
Confira as páginas a seguir para obter mais informações sobre o console:
Variáveis e comandos do console – uma visão geral e detalhada de como trabalhar com o console.
Referência de comandos do console – uma lista completa de comandos do console.
Referência de variáveis de console – uma lista completa de variáveis de console.
Editor de variáveis de console – Um plugin para editar variáveis de console diretamente no Unreal Editor.
Você também pode usar comandos de console em Blueprints e C++ para alterar variáveis a qualquer momento, mesmo quando o console estiver desabilitado em compilações de lançamento. Isso pode ser útil para dimensionamento as configurações de forma seletiva enquanto o aplicativo está em execução.
Log de saída
Ao trabalhar com o console no Unreal Editor, será mais fácil entender o que está acontecendo exibindo o Log de Saída, que contém um registro de comandos e logs.
Para visualizar o Log de Saída no Unreal Editor, clique em Window > Log de Saída. O Log de Saída será fixado na parte inferior do editor.
Os arquivos de log salvos são exibidos na pasta Saved/Logs do projeto.
Arquivos de configuração
As variáveis de console são armazenadas nos arquivos de configuração (.ini) como pares de valor-chave, fornecendo configurações padrão para as versões do jogo. Confira Arquivos de configuração para obter mais informações.
Perfis de dispositivo
Perfis de dispositivo são arquivos de configuração que contêm configurações para um dispositivo específico destinado ao projeto. Isso pode ser tão amplo quanto um grande grupo de dispositivos, como Android_Mid, ou tão preciso quanto peças individuais de hardware. Cada perfil de dispositivo tem uma série de substituições de configuração que entram em efeito apenas para esse dispositivo específico.
Os perfis de dispositivo da Unreal Engine giram principalmente em torno de famílias de GPU, como a série Adreno 7xx, mas você pode adicionar seus próprios perfis de dispositivo e definir regras para eles conforme necessário para o hardware suportado.
Para obter mais informações, consulte Como personalizar perfis de dispositivo e escalabilidade para Android.
Leitura adicional
Confira Considerações comuns de desempenho para obter mais informações sobre situações e fatores que podem afetar o desempenho do seu aplicativo.
Dicas e práticas recomendadas
Teste cedo e com frequência
Ao testar, antecipe que o projeto encontrará bugs específicos para cada plataforma para a qual você oferece suporte. Embora o Unreal Editor se esforce para fornecer uma pré-visualização precisa, nada substitui a geração de perfis diretamente no hardware de destino. Quanto mais tempo você ficar sem testar no hardware, maior é a probabilidade de surgir bugs que você não conhece.