Usando buffers de índice de 16 bits - USHORT vs UINT

7

No D3D11, eles ainda têm a capacidade de criar buffers de índice de 16 e 32 bits .

Poucos modelos usarão mais do que o máximo (20k tri) que um buffer de índice USHORT pode suportar, mas pagarei realmente um custo de desempenho ruim por sempre usar um formato INT (32 bits)?

A economia de memória não é muito (2 bytes por índice!). Para um modelo tri de 20k, são apenas 40 kB de memória que estamos economizando para usar o USHORT (em comparação com provavelmente muito mais apenas para os dados de vértice desse mesmo modelo).

Vale realmente a pena usar os buffers de índice USHORT, ou isso é apenas um resquício de quando os computadores tinham menos memória nos anos 90?

bobobobo
fonte
3
Se você está carregando 100 desses modelos, economiza 40 mB de memória. Em determinadas situações, a pena do que para salvar o máximo de memória possível (embora tudo é jogo dependentes, e para 90% dos projectos, não é realmente vale a pena)
thedaian
2
@ thedaian: Essa é uma resposta.
3
@thedaian, até onde eu sei, sua figura está desnivelada por um fator de 10 ^ 8. 100 * 40 kB faz 4 MB. De qualquer forma, eu ficaria mais preocupado em lidar com 2 milhões de triângulos em geral. 20k é muito para a maioria dos modelos, você pode ir muito longe com 1k e um bom mapa de relevo.
Aaaaaaaaaaaa
2
A largura de banda também é importante. 4mb salvos é 4mb menos para carregar na memória da GPU. A frequência com que você realmente faz isso é com você.
Justicle
11
Você pode ter triângulos de 64k com um buffer de índice de 16 bits - basta usar uma faixa de triângulo em vez de uma lista de triângulos.
Adam

Respostas:

10

Você deve considerar que as GPUs ao buscar os dados para alimentar os sombreadores de vértice exigem muitas chamadas pequenas, porque elas podem armazenar apenas alguns triângulos ao mesmo tempo, e a busca de dados na VRAM é uma operação muito lenta. Portanto, suponho que se você usar metade dos bytes para os índices, a GPU poderá buscar duas vezes os índices para o cache renderizar triângulos.

4 MB Pode haver uma pequena quantidade de memória para espaço de armazenamento, mas se você precisar fazer uma chamada complexa para processar apenas alguns bytes, isso poderá afetar o desempenho de maneira perceptível. Atualmente, as placas de vídeo são poderosas o suficiente para torná-las irrelevantes em jogos que não precisam processar muita geometria, você ... poderia fazer alguns benchmarks para renderizar um modelo com os dois tamanhos de índice, se você realmente quiser saber.

Os tempos de carregamento também são mais rápidos com índices de 16 bits e, na verdade, toda gravação ou leitura, a menos que você possa controlar efetivamente o alinhamento da memória e a paginação adequada. Portanto, não se trata apenas da memória necessária, mas de quanto é preciso para lidar com isso. Se você estiver trabalhando com buffers dinâmicos que precisam ser movidos pelo barramento para a GPU em algum momento entre os quadros, use índices de 16 bits quando possível. Se estiver renderizando geometrias ainda menores, é possível agrupar muitos índices em um único buffer de índice de 16 bits para que todos sejam copiados para a GPU em uma única chamada.

Aqui você pode encontrar algumas informações sobre como as GPUs da ATI mais recentes funcionam:

Recursos de treinamento para desenvolvedores da ATI Stream (desculpe por não encontrar o documento exato) Não li muito sobre os da NVidia, mas acho que eles funcionam mais ou menos com uma abordagem semelhante.

Pablo Ariel
fonte
5

Embora a velocidade da memória e da CPU tenha melhorado ao longo dos anos, os jogos ainda aumentam os limites de hardware e software. Se você está carregando 100 desses modelos, economiza 4 megabytes de memória. Em certas situações, vale a pena economizar o máximo de memória possível. Isso pode ser o suficiente para você carregar outro modelo, ou o suficiente para adicionar mais alguns efeitos sonoros ou outra música. Para a maioria dos jogos AAA, esse tipo de economia é vital para tornar as coisas melhores do que a concorrência.

Claro, tudo depende do jogo e, para muitos projetos, não vale a pena. Mas se você quiser empurrar o hardware o máximo possível, encontrará maneiras de economizar o máximo de memória possível, para ter espaço para adicionar mais coisas legais.

thedaian
fonte
4

Não se trata apenas de memória; algum hardware simples não suporta índices de 32 bits e deve executar o pipeline de vértices no software se você os usar. Está ficando mais raro, mas você ainda pode ter uma surpresa desagradável quando se deparar com uma. Os índices de 16 bits também podem ser executados mais rapidamente em geral, o que pode ser importante se você estiver sob pressão de desempenho, mas precisará avaliar e avaliar o benefício de desempenho extra dos índices de 16 bits versus a possibilidade de precisar dividir um modelo porque não há uma resposta única para a correta em todas as situações.

Maximus Minimus
fonte