Otimização de desempenho do Unity cinco: pressão do módulo de renderização

Pressão da CPU

Lote

Antes da renderização da GPU, a CPU enviará os dados para a GPU em lotes. Cada vez que for enviado, será um drawcall. Quando a GPU renderizar cada lote, ela mudará o estado de renderização. O estado de renderização aqui se refere a: o o objeto afetado está na tela As propriedades de renderização ou materiais da aparência, como: bola de sombreamento, adesivo, cor, modo de renderização (transparente, translúcido), etc.

Método de combinação em lote na unidade:

Prioridade:
SRP Batcher / Static Batching
GPU Instancing
Dynamic Batching

Condições para usar o Draw Call Batching
1. Suporta renderizadores de malha, renderizadores de trilha, renderizadores de linha, sistemas de partículas
e renderizadores Sprite, e só pode processar em lote renderizadores do mesmo tipo. Renderizadores de skin não são suportados.

2. Você precisa usar o mesmo material, então use Renderer.sharedMaterial em vez de
Render.material no script. Este último gera uma cópia do material, o que interromperá o lote.
3. Usar MaterialPropertyBlock também interromperá o lote, mas não será necessário. ainda é mais rápido do que usar vários materiais.
4. A renderização de objetos transparentes é executada estritamente em ordem e o processamento em lote pode ser facilmente interrompido.
5. Tente não usar valores de escala negativos.
 

Batching estático:

O objetivo do lote estático não é reduzir chamadas, mas reduzir alterações no status de renderização, porque antes da renderização, vários atributos de renderização do objeto precisam ser definidos. Se for o mesmo lote, basta configurá-lo uma vez.

A razão pela qual o lote estático não reduz drawcalls é porque os objetos em lote estático podem ser cortados, ele apenas mescla a matriz de vértices, mas o índice de vértice ainda está separado, para que você possa decidir qual submalha desenhar de acordo com o valor do índice, como 10 Um lote estático de grade se torna uma grade, mas a 5ª grade não está no tronco, há 2 drawcalls, a 1ª-4ª submesh, a 6ª-10ª submesh e a 5ª é cortada, embora haja duas drawcalls, a renderização o status só é definido uma vez

Se você não agrupar estaticamente, embora os shaders e texturas dessas 10 malhas sejam os mesmos, eles serão desenhados em 10 drawcalls, ou seja, 10 lotes, e você precisará definir 10 estados de renderização.


Detalhes adicionais:
1. Lote estático no editor, o Unity não usará nenhum recurso de CPU em tempo de execução para gerar dados de grade
2. Lote estático em tempo de execução terá um pico alto de CPU, o que pode causar/resultar congelamento único
3. Após o lote estático é concluído, o objeto se torna um todo e é estático, e a propriedade Transform não pode ser modificada.
4. A propriedade Transform do objeto raiz staticBatchRoot após o lote pode ser modificada
durante o tempo de execução. 5. Mas o lote é executado em tempo de execução O objeto precisa ativar a opção Leitura/Escrita
 

Mesclagem manual de malha

A mesclagem manual de malhas é semelhante à mesclagem estática em lote, mas não pode recortar a submalha. Se houver apenas uma única submalha no campo de visão, toda a malha será desenhada.

Lote Dinâmico

Possui dois tipos no Unity, um para malhas e outro para geometria gerada dinamicamente, como sistemas de partículas.

O objetivo do lote dinâmico é reduzir o tempo de CPU, mas o lote em si consome CPU, portanto, as condições para lote são relativamente rígidas.

Instância GPU

Princípio:
Para todos os objetos que atendem aos requisitos, o Unity armazena sua posição, zoom, deslocamento uv, lightmappindex e outras informações relacionadas no buffer constante do Constant Buffer de uma só vez. Quando um objeto entra no processo de renderização como uma instância, ele será com base no ID da instância de entrada é usado para recuperar as informações correspondentes da memória de vídeo para estágios de renderização subsequentes, sem ter que enviar dados para a GPU todas as vezes para obter efeitos de otimização.

Método de uso
1. Marque a opção Habilitar Instanciação no painel Inspetor do material
2. Use Graphics.DrawMeshInstanced ou Graphics.DrawMeshInstancedirdirect para chamar manualmente a instância da GPU

MaterialPropertyBlock

Usar MaterialPropertyBlock para definir uma cor aleatória não interromperá o lote. Se você usar material.setcolor diretamente, ele interromperá o lote, porque é uma bola de material separada, que é mais adequada para instância GPU e menos adequada para SRP Batcher.

Desvantagens : A prioridade é relativamente baixa e enviar um drawcall demora um pouco mais que o normal.

vantagem:

  • Comparado com o lote estático, não trará pressão adicional de memória.
  • Comparado com o lote dinâmico, não há restrições estritas de vértices.
  • É muito adequado para MaterialPropertyBlock e não interrompe o lote.

Cenas aplicáveis:
Cenas que precisam desenhar um grande número da mesma malha, como mar de grama, mata, etc.

Dosador SRP

Para materiais que usam a mesma variante de shader, ou seja, os shaders são agrupados em lote. Mesmo que as bolas de shader sejam inconsistentes, desde que os shaders sejam consistentes, está tudo bem. Quando o projeto é alternado para o pipeline SRP, as informações são transmitido através do UniformBuffer. Depois que o SRP Batcher for ativado, ele será pré-gerado Uniform Buffer, transferirá informações em lotes e lotes SRP Batcher em unidades de Shaders, o que pode efetivamente reduzir o número de SetPassCall (definir status de renderização) para Otimização de desempenho da CPU
 

princípio:

O processo de renderização do SPR Batcher não ativado é: os atributos de cada objeto terão um CBuffer na GPU, que inclui atributos do Gameobject, como transformação, atributos de material, como materiais, mapas de luz, etc. Quando as propriedades são atualizadas, os dados devem ser zerados. Cada vez que um material é adicionado, o cbuffer correspondente será configurado novamente, o que consome CPU.

Depois de ligado, o processo muda. O mesmo shader gerará um grande buffer para atributos diferentes, como transformação. Para os mesmos atributos, como mapas de luz, cada um gerará um pequeno permaterial. Quando houver O buffer será modificado somente quando o estado muda.Se apenas a transformação for modificada, os dados na mesma posição só serão gravados através do deslocamento.

Para o material recém-adicionado, seu sombreador não mudou, portanto o lote não será alterado.

Tradicionalmente, as pessoas tendem a reduzir o número de chamadas de desenho para otimizar a CPU. A chamada de desenho em si é apenas alguns bytes inseridos no buffer de comando da GPU. O custo real da CPU vem das muitas configurações antes da chamada de desenho. O SRP Batcher faz isso. não reduz o número de chamadas de desenho. , apenas reduz o custo de configuração entre chamadas de desenho

Requisitos de pipeline de renderização:
suporta URP, HDRP, SRP, pipeline integrado não é suportado
Requisitos de objeto de jogo:
deve conter uma malha ou malha com skin, não partículas
Não é possível usar MaterialPropertyBlock
Shader deve ser compatível com SRP Batcher
 

Vantagens:
salva operações de gravação UniformBuffer, suporta objetos dinâmicos e suporta uma gama mais ampla do que lote estático. Ao mesmo tempo, o custo de memória será muito menor e também é aplicável a situações com muitos materiais.

Cenários aplicáveis:
a taxa de repetição de shaders é alta, mas o número de variantes de shaders deve ser controlado
 

Comparação de quatro métodos

Prioridade:
SRP Batcher / Static Batching > GPU Instancing > Dynamic Batching
Situações aplicáveis:
Static Batching + SRP Batcher: Cidade principal, edifício de cópia
SRP BatcherOnly: Uma ampla variedade de vegetação
Instanciação de GPU: Um único tipo de vegetação
Dynamic Batching: Ul, partículas, Sprite espere

Abate

Antes da renderização da GPU, a CPU precisa transferir os dados de renderização para a GPU, portanto, alguns objetos que não precisam ser renderizados precisam ser eliminados primeiro, o que é Culling. O motor Unity suporta nativamente o view frustum culling, que elimina objetos fora do volume de visualização.Os dados desses objetos não precisam ser passados ​​para a GPU para processamento.

No Unity, todo o conteúdo visual herda do Renderer, como MeshRenderfer, SpriteRenderer, LineRenderer, SkinnedMesh Renderer, TrailRenderer, etc. O Unity os filtra durante o processo de renderização e executa automaticamente operações de seleção de tronco.

Se houver um grande número de câmeras ativadas na cena, o tempo total gasto no Culling também aumentará proporcionalmente. Mesmo que não seja usado para exibir objetos, o tempo de seleção ainda será executado. A função é refletida em ->Camera .Renderer no tópico Render. 

Grupo de Culling

CullingGroup é uma interface API fornecida pelo Unity. É o mesmo sistema que o próprio sistema Cu e LOD do Unity. É equivalente a abrir algumas funções subjacentes do Cull para uso dos usuários. Unity - Manual: CullingGroup
API

Oclusão

Introdução básica
A câmera realiza operações de seleção em cada quadro. Essas operações verificam os renderizadores na cena e excluem
(selecionam) aqueles que não precisam ser desenhados
. Por padrão, a câmera executa a seleção de tronco.

Como funciona
Os dados sobre a cena são gerados no Editor do Unity e usados ​​em tempo de execução para determinar o que a câmera pode ver . O processo de geração de dados é chamado de cozimento.
Ao preparar dados de seleção de oclusão, o Unity divide a cena em várias unidades e gerar dados que descrevem a geometria dentro da unidade e a visibilidade entre unidades adjacentes, então, o Unity mescla as unidades tanto quanto possível para reduzir o tamanho dos dados gerados e, em tempo de execução, o Unity carrega esses dados preparados na memória e para cada câmera com a propriedade Occlusion Culling habilitada, uma consulta é realizada nos dados para determinar o que aquela câmera pode ver

A função CullQueryPortalVisibilitylJmbra aparecerá no subthread de CullSendEvents.
Esta função também aparecerá no thread de trabalho durante o teste.

Recomendações

Obstrução:

  • Objetos de oclusão grandes têm boa qualidade de oclusão, como montanhas
  • Não é adequado combinar grandes objetos bloqueadores porque os bloqueios não podem ser acumulados, como uma floresta.
  • Não tenha muitas lacunas, como queijo
  • Ao modelar, tome cuidado para evitar lacunas não intencionais.
  • Tente não permitir que a câmera entre no interior da obstrução, o que pode ser conseguido através de colisão

Objeto obscurecido:

  • A maioria deles pode ser definida como objetos ocluídos para facilitar a eliminação.
  • Objetos muito grandes não são adequados como objetos ocluídos porque estarão sempre visíveis, como o terreno, e você pode considerar dividi-los em várias partes.




 

Acho que você gosta

Origin blog.csdn.net/qq_37672438/article/details/132003379
Recomendado
Clasificación