O custo prático de trocar efeitos

16

Eu uso o XNA para meus projetos e, nesses fóruns, às vezes vejo referências ao fato de que trocar um efeito por uma malha tem um custo relativamente alto, o que me surpreende ao pensar em trocar um efeito. à GPU junto com os parâmetros apropriados.

Gostaria de saber se alguém poderia explicar exatamente o que é caro sobre esse processo? E, se possível, 'relativamente' em contexto?

Por exemplo, digamos que eu queira usar um shader curto para ajudar na escolha, eu:

  1. Altere o efeito em cada objeto, calculando uma cor única para identificá-lo e fornecendo-o ao shader.
  2. Desenhe todos os objetos para um destino de renderização na memória.
  3. Pegue a cor do alvo e use-a para procurar o objeto selecionado.

Qual parte do tempo total gasto para concluir esse processo seria gasto trocando os shaders? Meus instintos diriam que tornar a cena novamente, por mais simples que seja o sombreador, seria uma ordem de magnitude mais lenta que qualquer outra parte do processo; por que toda a preocupação com os efeitos?

sebf
fonte

Respostas:

21

O problema que você está descrevendo não é um problema "especial". Não há nada de lento em alterar os efeitos na GPU. O problema com a alteração de efeitos, parâmetros de efeito (incluindo transformações), texturas, vários estados de renderização e o simples envio de vários comandos de desenho é que é necessário que outro lote seja enviado à GPU .

Os lotes são vinculados à CPU e você recebe apenas alguns milhares * por quadro para usar.

Depende da CPU e de outros trabalhos que você está fazendo, mas digamos que você receba cerca de 1000 lotes por quadro. Se você estiver renderizando um objeto por lote, poderá desenhar cerca de 1000 objetos na tela antes de encontrar problemas.

Se você adicionar subitamente picking e precisar renderizar todos os seus objetos duas vezes, ficará limitado a desenhar apenas 500 objetos.

(Portanto, se você tiver apenas um pequeno número de objetos, não se preocupe!)

Para reduzir o número de lotes que você está usando, você basicamente precisa ser "inteligente". O método prototípico para fazer isso é combinar inteligentemente vários objetos em um único lote. Em particular, procure " instanciamento ". Talvez você possa usar o número da instância para atribuir uma cor exclusiva a cada objeto no seu sombreador.

Outra técnica, especialmente adequado para a colheita, é abater os objetos renderizados em software de modo que você não está prestando qualquer coisa que você sabe que não está tocando seu pixel escolhido.

Aqui está um conjunto completo de slides da NVidia intitulado "Lote, lote, lote: o que isso realmente significa?" (PDF) que possui bons gráficos e outras coisas que explicam isso. Ele também lista algumas técnicas para reduzir sua contagem de lotes.

Andrew Russell
fonte
Acordado! Obrigado por explicar e pelas sugestões, o que eu li faz muito mais sentido agora. Obrigado também pela apresentação da NVidia, estou lendo agora e é muito útil.
sebf 14/02
1
Link atualizado para o documento "Lote, lote, lote": ce.u-sys.org/Veranstaltungen/…
Marton
1
Graças Marton, Eu editei o novo link para o post :)
Andrew Russell