Identificar os passes de renderização mais caros

O AGI Frame Profiler permite examinar passagens de renderização individuais usadas para compor um único frame do seu app. Ele faz isso interceptando e gravando todo o estado necessário para executar cada chamada de API gráfica. No Vulkan, isso é feito de modo nativo usando o sistema de camadas do Vulkan. No OpenGL, os comandos são interceptados usando o ANGLE, que converte comandos do OpenGL em chamadas do Vulkan para que eles possam ser executados no hardware.

Dispositivos Adreno

Para identificar seus passes de renderização caros, primeiro confira a visualização da linha do tempo do AGI na parte superior da janela. Isso mostra todos os passes de renderização que compõem a composição de um determinado frame cronologicamente. É a mesma visualização que você veria no System Profiler se tivesse informações da fila da GPU. Ele também apresenta informações básicas sobre o passe de renderização, como a resolução dos framebuffers que estão sendo renderizados, o que pode fornecer algumas informações sobre o que está acontecendo na passagem de renderização.

Visualização da linha do tempo do frame
Figura 1. Visualização da linha do tempo do frame

O primeiro critério que pode ser usado para investigar os passes de renderização é o tempo que eles levam. O passe de renderização mais longo provavelmente será aquele com o maior potencial de melhoria. Portanto, comece analisando-o.

Como identificar o passe de renderização mais longo na visualização da linha do tempo do frame
Figura 2. Identificar o passe de renderização mais longo na visualização da linha do tempo do frame

A fração da GPU referente ao cartão de renderização relevante já apresentará algumas informações sobre o que está acontecendo no cartão:

  1. Agrupamento: onde os vértices são colocados em agrupamentos com base no ponto em que ficam na tela
  2. Renderização: onde os pixels ou fragmentos são sombreados
  3. Carregamento/armazenamento GMEM: quando o conteúdo de um framebuffer é carregado ou armazenado da memória interna da GPU para a memória principal.

Você pode ter uma boa ideia de onde podem estar os possíveis gargalos observando quanto tempo cada um deles leva no passe de renderização. Por exemplo:

  • Se o agrupamento demorar muito tempo, isso vai sugerir um gargalo com dados de vértice que sugere muitos vértices, vértices grandes ou outros problemas relacionados a vértices.
  • Se a renderização demorar mais, isso sugere que o sombreamento é o gargalo. As possíveis causas podem ser sombreadores complexos, muitas buscas de textura, renderização de um framebuffer de alta resolução quando não é necessário ou outros problemas relacionados.

O carregamento e as lojas do GMEM também são algo a ter em mente. É caro mover itens da memória gráfica para a memória principal, portanto, minimizar a quantidade de operações de carregamento ou armazenamento também ajuda no desempenho. Um exemplo comum disso é ter um estêncil/profundidade de armazenamento GMEM, que grava o buffer de profundidade/estêncil na memória principal. Se você não estiver usando esse buffer em passagens de renderização futuras, essa operação de armazenamento poderá ser eliminada e você economizará tempo de frame e largura de banda de memória.

Identificar cargas e lojas do GMEM
Figura 3. Identificar cargas e armazenamentos do GMEM

Investigação do passe de renderização grande

Para ver todos os comandos de desenho individuais emitidos durante o passe de renderização:

  1. Clique no passe de renderização na linha do tempo. Isso abre o cartão de renderização na hierarquia encontrada no painel Commands do Frame Profiler.

  2. Clique no menu do cartão de renderização, que exibe todos os comandos de exibição individuais emitidos durante o cartão. Se esse for um aplicativo OpenGL, você pode ir ainda mais longe e ver os comandos do Vulkan emitidos pelo ANGLE.

Painel de comandos
Figura 4. Painel de comandos

Selecione uma das chamadas de desenho. O painel Framebuffer é aberto, que mostra todos os anexos de framebuffer que foram vinculados durante o desenho e o resultado final do desenho no framebuffer anexado. Aqui você também pode usar o AGI para abrir as chamadas de desenho anterior e seguinte e comparar a diferença entre as duas. Se eles forem visualmente quase idênticos, isso sugere uma oportunidade de eliminar uma chamada de desenho que não contribua para a imagem final.

Seleção de chamadas de desenho individuais no painel Comandos
Figura 5. Selecionar chamadas de desenho individuais no painel "Comandos".

A abertura do painel Pipeline para esse desenho mostra o estado usado pelo pipeline de gráficos para executar essa chamada de desenho.

Painel do pipeline
Figura 6. Painel de pipeline

O Assembler de entrada fornece informações sobre como os dados de vértice foram vinculados a esse desenho. Essa é uma boa área para investigar se você notou que o agrupamento ocupa uma grande parte do tempo do cartão de renderização. Aqui é possível conseguir informações sobre o formato do vértice, o número de vértices desenhados e como os vértices são dispostos na memória. Para mais informações, consulte Analisar formatos de vértice.

Seção "Assembler de entrada" no painel "Pipeline"
Figura 7. Inserir a seção do Conversor no painel do pipeline.

A seção Vertex Shader fornece informações sobre o sombreador de vértice que você usou durante esse desenho e também pode ser um bom lugar para investigar se o agrupamento foi identificado como um problema. É possível ver o SPIR-V e o GLSL descompilado do sombreador usado e investigar os Buffers uniformes vinculados para essa chamada. Consulte Analisar o desempenho do sombreador para saber mais.

Seção Vertex Shader no painel Pipeline
Figura 8. Seção "Vertex Shader" no painel "Pipeline"

A seção Rasterizer mostra informações sobre a configuração de função mais fixa do pipeline e pode ser usada mais para fins de depuração do estado de função fixa, como janela de visualização, tesoura, estado de profundidade e modo polígono.

Seção "Varredor" no painel "Pipeline"
Figura 9. Seção do rasterizador no painel "Pipeline"

A seção Sombreiro de fragmentos fornece muitas das mesmas informações encontradas na seção Sombreiro de fragmentos, mas específicas para o Sombreiro de fragmentos. Nesse caso, você pode conferir quais texturas estão sendo vinculadas e investigá-las clicando na alça.

Seção Shader de fragmentos no painel Pipeline
Figura 10. Seção do Shader de fragmentos no painel Pipeline

Investigação do passe de renderização menor

Outro critério que pode ser usado para melhorar o desempenho da GPU é analisar grupos de passes de renderização menores. Em geral, o ideal é minimizar ao máximo a quantidade de passes de renderização, porque a GPU leva tempo para atualizar o estado de um cartão de renderização para outro. Esses passes de renderização menores geralmente são usados para fazer coisas como gerar mapas de sombra, aplicar desfoque gaussiano, estimar a luminância, fazer efeitos de pós-processamento ou renderizar a interface. Alguns deles podem ser consolidados em um único passe de renderização ou até mesmo eliminados completamente se não afetarem a imagem geral o suficiente para justificar o custo.

Transmissões de renderização menores usadas para reduzir a amostra do buffer de resolução nativa
Figura 11. Passes de renderização menores usados para reduzir a amostra do buffer de resolução nativa