A Unreal Engine 5 (UE5) expande os recursos do Unreal Insights adicionando rastreamento de memória aprimorado e suporte à criação de perfil em sua funcionalidade Memory Insights. Os desenvolvedores agora podem ver informações mais detalhadas sobre a alocação e desalocação de memória, incluindo as tags de memória de nível baixo (MNB) e pilhas de chamadas associadas a cada bloco de memória em qualquer momento.
O Memory Insights inclui uma funcionalidade de consulta que pode encontrar alocações em tempo real em um determinado momento, reconhecer aumentos ou reduções no uso de memória, diferenciar alocações de curto e longo prazo e encontrar vazamentos de memória.
A UE5.4 e versões posteriores suportam rastreamento de memória com pilhas de chamadas para projetos Android.
Como gravar uma sessão
Para começar a usar as informações de memória para gravar um rastro no canal de memória, siga as etapas a seguir:
Execute ou compile Unreal Insights
Vá até Início > Prompt de Comando e insira o seguinte:
Engine\Binaries\Win64\UnrealInsights.exeVocê também pode navegar até a pasta Engine\Binaries\Win64 e clicar duas vezes para executar UnrealInsights.exe.
Execute o seu projeto de jogo com rastreamento de memória
Inicialize o prompt de comando do seu sistema operacional e execute a amostra do projeto:
cd C:\MyEngineInstallLocation\
Samples\Games\MyGameSample\Binaries\Win64\MyGameSample.exe -trace=default,memoryPara gravar uma sessão do seu projeto, é preciso que o canal de rastreamento de memória esteja ativo desde o início do processo. Caso contrário, não será possível iniciar o rastreamento de eventos de alocação em uma sessão de conexão tardia. Além disso, se você executar um rastreamento em um projeto empacotado, verifique se ele está empacotado no modo de Desenvolvimento.
Você pode usar o metadata do comando de rastreamento e o assetmetadata para fornecer opções adicionais de filtragem para nomes de ativos e nomes de classes. Por exemplo, você pode calcular o custo de alocação de memória por nome de ativo ou por nome de classe.
Samples\Games\MyGameSample\Binaries\Win64\MyGameSample.exe -trace=default,memory,metadata,assetmetadataAbra seu rastreamento no navegador da sessão do Insights
Volte ao navegador da sessão do Insights e clique duas vezes no seu arquivo .utrace para abri-lo para análise na janela de Timing Insights da Unreal Engine. Selecione Menu > Memory Insights para abrir a janela do Memory Insights.
Alocação de memória — Faixas do gráfico
O Unreal Insights captura pilhas de chamadas completas para cada evento de alocação para fornecer uma análise da memória do projeto. A interface principal do Memory Insights consiste em uma linha do tempo que mostra uma visão geral do uso da memória durante a sessão.
O gráfico da memória principal mostra a quantidade total de memória rastreada no seu projeto, incluindo informações de cada tag coletada do MNB. Além disso, há gráficos que exibem o número total de alocações em tempo real:
| Tipo de gráfico | Cor | Descrição |
|---|---|---|
Memória total alocada | Azul | Mostra a quantidade total de memória alocada em cada momento, com base no rastreamento detalhado da alocação. |
Contagem de alocação disponível | Amarelo | Mostra o número total de alocações ativas em qualquer momento. |
Contagem de eventos de alocação/livres | Verde/Laranja | Mostra o número de eventos de alocação e livres por unidade, representados como uma "fatia" de tempo. |
Cada um desses gráficos se baseia em um rastreamento de alocação detalhado. Eles começam em um valor de tempo de 0 e têm uma granularidade de aproximadamente 1 ms. Os outros gráficos com as tags de prefixo MNB (RenderTargets, SceneRender, UObject) são baseados em um sistema de tempo de execução de rastreamento de memória de baixo nível.
Essas tags começarão a rastrear vários segundos após o início da sessão e contêm uma granularidade por quadro.
Por padrão, emitimos um carimbo de data/hora em todo evento de alocação/livre 4096. Se necessário, você pode alterar esse valor modificando o MarkerSamplePeriod localizado em Engine/Source/Runtime/Core/Private/ProfilingDebugging/MemoryAllocationTrace.cpp. Por exemplo, definir o valor 0 dessa variável fará com que um carimbo de data/hora seja emitido após cada evento de alocação/livre.
A linha do tempo do Memory Insights permite a sobreposição de faixas na Visualização de Sincronia. Ao usar a visualização do Memory Insights, há quatro painéis disponíveis: Sincronia, Investigação, Tags de MNB e Módulos.
Visualização de Sincronia
Você pode clicar em Sincronia para alternar a exibição da janela Visualização de Sincronia. Aqui você pode observar e filtrar os dados de desempenho de diferentes faixas relacionados ao uso de memória.
Painel Investigação
O painel Investigação permite fazer diferentes consultas sobre alocações.
Tags de memória de nível baixo (MNB)
O painel Tags de MNB controla a visibilidade de diferentes tags de MNB. Esses dados são rastreados diretamente do sistema operacional.
Você pode agrupar tags de MNB, ativos e arquivos de código-fonte. Além disso, pode clicar com o botão direito em qualquer tag de MNB no painel Tags de MNB e selecionar Gerar nova cor ou Editar cor para personalizar a cor mostrada na exibição.
Módulos
Quando os símbolos da pilha de chamadas são resolvidos, o resultado é armazenado no arquivo de cache. Você pode visualizar esses arquivos clicando em Módulos. Este painel permite abrir arquivos de rastreamento antigos e usar símbolos.
Você pode observar as colunas para o número de símbolos Descoberto, Em cache, Resolvido e Com falha. Os itens da lista que falharam têm o destaque em vermelho, e os itens da lista que foram resolvidos corretamente têm o destaque em verde. Amarelo indica que alguns dos símbolos foram resolvidos e outros falharam.
A implementação anterior do rastreamento de memória em tempo de execução é implementada na classe LowLevelMemTracker, localizada na pasta Engine\Source\Runtime\Core\Public\HAL\LowLevelMemTracker.h. O painel Tags de MNB e os gráficos de MNB usam dados rastreados diretamente desse sistema. Os dados de alocação detalhados vêm de uma implementação de rastreamento específica e separada.
O Memory Insights contém novas funcionalidades de consulta e informações de alocação de memória rastreada. Você pode identificar blocos de memória que a UE5 aloca e libera em determinadas janelas de tempo, antes ou depois de um momento específico, ou verificar se há vazamentos de memória. Você pode acessar o sistema de consulta na aba Investigação após abrir um log de rastreamento.
A barra de status na parte inferior do painel Módulos fornece informações sobre o número total e o tamanho dos módulos.
Investigação — Consultas de alocação
Embora a linha do tempo forneça uma visão geral do uso de memória, a avaliação do comportamento de alocações individuais ao longo de um período é feita com "consultas". Uma consulta é definida por uma regra e um ou mais carimbo de data/hora, como os rótulos A e B.
As regras de consulta disponíveis são as seguintes:
| Regra de consulta | Variável de tempo | Descrição |
|---|---|---|
Alocação ativa | A | Exibe todas as alocações ativas no tempo A. |
Antes | A | Exibe todas as alocações antes do tempo A. |
Depois | A | Exibe todas as alocações após o tempo A. |
Declínio | A e B | Exibe todas as alocações alocadas antes do tempo A e liberadas entre o momento A e o momento B. |
Crescimento | A e B | Exibe todas as alocações que foram alocadas entre os tempos A e B e liberadas após o tempo B. |
Crescimento vs. Declínio | A e B | Identifica as alocações de "crescimento" (alocadas entre o tempo A e o tempo B e liberadas após o tempo B) e as alocações de "declínio" (alocadas antes do tempo A e liberadas entre o tempo A e o tempo B). As alocações de declínio são alteradas para ter um tamanho negativo, de modo que a agregação de tamanho mostre a variação entre A e B. O resultado dessa consulta é uma comparação do que foi alocado no tempo A com o que foi alocado no tempo B. Um agrupamento de alocações de memória por tags ou pilha de chamadas mostrará a variação (B - A) para cada grupo. |
Eventos livres | A e B | Exibe todas as alocações que foram liberadas entre os tempos A e B. |
Eventos alocados | A e B | Exibe todas as alocações alocadas entre os tempos A e B. |
Alocações de vida curta | A e B | Exibe todas as alocações alocadas após o tempo A e liberadas antes do tempo B. Essa regra identifica alocações que podem ser empilhadas, ou seja, identifica alocações temporárias ou de curta duração. |
Alocações de longa duração | A e B | Exibe todas as alocações que foram alocadas antes do tempo A e liberadas após o tempo B. |
Vazamentos de memória | A, B e C | Exibe todas as alocações que foram alocadas entre os tempos A e B e não foram liberadas até depois do tempo C. Isso é útil para encontrar memória que deveria ser liberada em um determinado momento, por exemplo, durante uma transição de nível. |
Tempo de vida limitado | A, B e C | Exibe todas as alocações que foram alocadas entre o tempo A e B e liberadas entre o tempo B e C. |
Declínio das alocações de vida longa | A, B e C | Exibe todas as alocações que foram alocadas antes do tempo A e liberadas entre o tempo B e C. |
Tempo de vida específico | A, B, C e D | Exibe todas as alocações alocadas entre os tempos A e B e liberadas entre os tempos C e D. |
Consultas são feitas selecionando uma regra e arrastando os marcadores rotulados na linha do tempo para os locais desejados, ou especificando um tempo na aba Investigação.
Depois de selecionar as regras e os tempos desejados, pressione o botão Executar consulta na aba Investigação para fazer a consulta.
Dependendo da consulta e do conjunto de dados que está sendo capturado, as consultas podem levar um tempo considerável para serem executadas.
Visão do detalhamento da alocação
Quando a consulta é executada, uma nova janela é exibida. Após a consulta, a tabela de alocação é preenchida com o resultado. Por padrão, esses resultados serão exibidos em uma lista simples.
Por padrão, cada alocação exibe:
Contagem
Tamanho
Tag de MNB
Função (alocação)
Pilha de chamadas de alocação
Função (livre)
Pilha de chamadas livres
Para exibir parâmetros adicionais, clique com o botão direito no cabeçalho da tabela e defina as configurações desejadas no cabeçalho Visibilidade da coluna. Além disso, você pode passar o mouse sobre o marcador à esquerda da alocação para ver mais detalhes.
Você pode ver detalhes adicionais sobre as alocações selecionadas na barra de status na parte inferior da tela, como contagem total e tamanho da memória.
Classificação
Ao clicar nos cabeçalhos da tabela, você pode classificar a lista em diferentes colunas.
| Classificar Coluna | Descrição |
|---|---|
Hierarquia de alocação | Classifica pela hierarquia da árvore de alocação. |
Contagem de alocação | Classifica pelos números de alocações. |
Tamanho | Classifica pelo tamanho das alocações. |
Tag de MNB | Classifica pela tag de MNB das alocações. |
Função de topo (pilha de chamadas) | Classifica pela função de topo resolvida da pilha de chamadas das alocações. |
Tamanho da pilha de chamadas | Número de quadros da pilha de chamadas. |
Agrupamento
As opções de Predefinição podem ser usadas para agrupar alocações.
| Opção de predefinição | Descrição |
|---|---|
Padrão | Exibe as alocações padrão. |
Detalhado | Configura a visualização de árvore para mostrar informações de alocação detalhadas. |
Heap | Investiga como diferentes tipos de memória são usados. Confira Vários espaços de endereçamento. |
Tamanho | Encontra grandes alocações rapidamente. |
Tags | Exibe as alocações por sistema. |
Ativo (pacote) | Configura a visualização em árvore para mostrar um detalhamento das alocações por metadados de pacote e nome de ativo. |
Nome da Classe | Configura a visualização em árvore para mostrar uma divisão das alocações de acordo com o nome da classe. |
Pilha de chamadas de alocação | Configura a visualização em árvore para mostrar uma análise das alocações por pilha de chamadas. |
Pilha de chamadas de alocação invertida | Configura a visualização em árvore para mostrar uma divisão de alocações por pilha de chamadas invertida. |
Pilha de chamadas livres | Configura a visualização em árvore para mostrar uma divisão de alocações por pilha de chamadas livres. |
Pilha de chamadas livres invertida | Configura a visualização em árvore para mostrar uma divisão de alocações por pilha de chamadas livres invertida. |
Endereço (págia 4k) | Agrupa alocações em páginas de memória alinhadas em 4k com base em seus endereços.
|
Se desejar, acesse Hierarquia e clique em Tudo para abrir um menu suspenso para alterar a visualização simples padrão para grupos alternativos adicionais.
Você pode agrupar a hierarquia a partir da lista das seguintes opções.
| Grupo de hierarquia | Descrição |
|---|---|
Simples | Cria um grupo único que inclui todos os itens. |
Tamanho | Agrupa alocações com base em seu tamanho. |
Tag | Cria uma árvore com base na hierarquia de tags. |
Pilha de chamadas | Cria uma árvore com base na pilha de chamadas de cada alocação. |
Pilha de chamadas invertida | Cria uma árvore com base na pilha de chamadas de cada alocação. |
Heap | Cria uma árvore com base em Heap. Subgrupos para Alocações e Heaps estão disponíveis para heaps raiz. |
Valores únicos — Distância do evento | Cria um grupo para cada valor de distância do evento. |
Valores únicos — Hora de início | Cria um grupo para cada valor de hora de início. |
Valores únicos — Hora de término | Cria um grupo para cada valor de hora de término. |
Valores únicos — Duração | Cria um grupo para cada valor de duração. |
Valores únicos — Endereço | Cria um grupo para cada valor de endereço. |
Valores únicos — Página de memória | Cria um grupo para cada valor da página de memória. |
Valores únicos — Tamanho | Cria um grupo para cada valor de tamanho. |
Valores únicos — Tag de MNB | Cria um grupo para cada valor de tag de MNB. |
Valores únicos — Ativo | Cria um grupo para cada valor de ativo. |
Valores únicos — Nome de classe | Cria um grupo para cada valor de nome de classe. |
Valores únicos — Função de topo | Cria um grupo para cada valor de função de topo. |
Valores únicos — Arquivo de código-fonte de topo | Cria um grupo para cada valor de arquivo de código-fonte de topo. |
Valores únicos — Tamanho de pilha de chamadas | Cria um grupo para cada valor de tamanho da pilha de chamadas. |
Decomposição do caminho — Tag de MNB | Cria uma hierarquia de árvore a partir da estrutura de valores de string de tag de MNB. |
Decomposição do caminho — Ativo | Cria uma hierarquia de árvore a partir da estrutura de valores de string de ativo. |
Decomposição do caminho — Arquivo de código-fonte de topo | Cria uma hierarquia de árvore a partir da estrutura de valores de string de arquivo de código-fonte de topo. |
Filtragem avançada
A caixa de texto de pesquisa fornece um método para filtrar rapidamente o resultado com base no texto do nó hierárquico. O conjunto de alocações produzido pela consulta pode ser filtrado para isolar um grupo de alocações clicando em Filtrar configurador ao lado da caixa de texto de pesquisa.
É possível criar consultas avançadas usando grupos e as palavras-chave AND/OR.
Resolução de símbolo de pilha de chamadas
O rastreamento de símbolos da pilha de chamadas do seu projeto é realizado usando endereços do contador de programa. Na análise, esses endereços precisam ser resolvidos em strings legíveis com informações sobre os arquivos correspondentes.
Isso exige que o Memory Insights tenha acesso à versão correta do arquivo que contém as informações de depuração: ou um arquivo .pdb ou .elf (dependendo da plataforma). O Insights procurará o arquivo correto de acordo com a seguinte lista:
Novos caminhos inseridos pelo usuário nesta sessão.
Caminho do executável (se disponível em algumas plataformas, será compilado no binário).
Caminhos da variável de ambiente
UE_INSIGHTS_SYMBOLPATH. Essa variável aceita caminhos separados por ponto e vírgula.Caminhos de
_NT_SYMBOL_PATH.Caminhos do arquivo de configuração do usuário.
Quando os símbolos são resolvidos, os resultados são armazenados no arquivo de cache. Você pode visualizar esses arquivos clicando no painel Módulos. Você pode abrir esses arquivos clicando com o botão direito no arquivo selecionado e selecionando uma das opções a seguir no menu suspenso.
Fornece um método para enviar o arquivo de rastreamento a outros usuários sem exigir que eles tenham acesso às informações de depuração.
| Método de carregamento | Descrição |
|---|---|
Carregar símbolos do arquivo | Carrega símbolos para um módulo especificando um arquivo. Em caso de sucesso, tenta carregar outros módulos com falha do mesmo diretório. |
Carregar símbolos do diretório | Carrega símbolos para um módulo especificando um diretório. Em caso de sucesso, tenta carregar outros módulos com falha do mesmo diretório. |
No momento, a resolução de símbolos está disponível em Win64, XB1/XSX, PS4/PS5 e Switch.
Vários espaços de endereço
O rastreamento de memória rastreia a memória em diferentes heaps. De modo conceitual, toda alocação deve pertencer a um heap raiz, que representa um tipo de memória. Por exemplo, em plataformas de desktop, um heap raiz é a memória do sistema, e o outro é a memória de vídeo na placa de vídeo. Cada heap raiz tem seu próprio espaço de endereço. Em cada heap raiz, são feitas alocações de heap que podem hospedar alocações. Normalmente, isso significa alocações de memória virtual que suportam alocações, porém, alocadores do tipo bloco também podem ser representados com alocações de heap. Isso permite investigar o uso desses blocos de memória.
Exportar instantâneo
Você pode exportar alocações de memória como um arquivo .csv ou .tsv clicando com o botão direito e selecionando Exportar instantâneo no menu de contexto.