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.
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.
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:
- Agrupamento: onde os vértices são colocados em agrupamentos com base no ponto em que ficam na tela
- Renderização: onde os pixels ou fragmentos são sombreados
- 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.
Investigação do passe de renderização grande
Para ver todos os comandos de desenho individuais emitidos durante o passe de renderização:
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.
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.
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.
A abertura do painel Pipeline para esse desenho mostra o estado usado pelo pipeline de gráficos para executar essa chamada de desenho.
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.
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.
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.
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.
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.