Pergunta

Eu tenho um (básico) voxel motor funcionando e um sistema de água que parece (e eu assumo basicamente funciona) assim: https://www.youtube.com/watch?v=q_tdeguioots (não meu jogo).


Os valores de água são armazenados em uma matriz 3D de flutuantes, e a cada 0,05s calcula o fluxo de água, verificando o voxel abaixo e adjacente (Y-1, X-1, X + 1, Z-1, Z + 1) e adiciona O valor que.


Este sistema funciona bem (70+ fps) para pequenas quantidades de água, mas quando eu começo a calcular a água em 8+ pedaços, fica demais. (Eu desativei toda a criação de renderização ou malha para verificar se é o gargalo, não é. É puramente os cálculos de fluxo).


Eu não sou um programador muito experiente, então eu não saberia onde começar a otimizar, além de fazer os cálculos acontecer em uma coroutine como eu já fiz.


Neste post: https://gamedev.stackexchange.com/questions/ 55414 / How-to-define-áreas-cheias-com água (perto da parte inferior) Boreal sugere corrigi-lo em um calma de computação . Isso é a maneira de ir para mim? E como eu iria dessa coisa?


Qualquer ajuda é muito apreciada.

Foi útil?

Solução

Se você está realmente calculando uma simulação baseada em voxel, você estará expandindo o número de cálculos geometricamente, pois o tamanho aumenta, então você ficará rapidamente sem processamento em volumes maiores.

Um sombreamento de computação é ótimo para fazer cálculos massivamente paralelos rapidamente, embora seja um paradigma de programação muito diferente que leva alguns se acostumar. Um sombreador de computação verá o conteúdo de um buffer (ou seja, uma 'textura' para os civis dos EUA) e fazer coisas muito rapidamente - no seu caso, o buffer provavelmente será um buffer / textura cujos valores de pixels representam células da água. Se você quiser fazer algo realmente simples, como incrementá-los ou descer, o compute shader usa o poder de processamento paralelo da GPU para fazê-lo muito rápido.

A parte difícil é que GPUs são otimizado para processamento paralelo . Isso significa que você não pode escrever código como "Texela.Value += Texelb.Value" - sem trabalho extra da sua parte, cada fragmento do buffer é processado com zero conhecimento do que acontece nos outros fragmentos. Para referenciar outros texels, você precisa ler a textura novamente de alguma forma - algumas técnicas lêem uma textura várias vezes com deslocamentos ( Este exemplo de GL Faça isso para implementar os Blurs, outros o fazem repetidamente processando uma textura, colocando o resultado em uma textura temporária e depois reprocessando isso.

No nível de 10.000 pés: Sim, um compute sombreador é uma boa ferramenta para esse tipo de problema, uma vez que envolve toneladas de cálculo auto-semelhante. Mas, não será fácil fazer fora do morcego. Se você não fez programação convencional de shader antes, você pode querer olhar para o primeiro a se acostumar com a maneira como o trabalho GPUs. Mesmo ferramentas realmente básicas (se - então - else ou loops) têm implicações de desempenho muito diferentes e usos na programação GPU e leva algum tempo para obter a cabeça em torno das diferenças. A partir desta escrita (1/10/13) parece nvidia e udacidade estão oferecendo uma introdução para calcular Curso de sombreamento Qual pode ser uma boa maneira de se levantar para a velocidade.

fwiw Você também precisa de hardware muito moderno para computar sombreadores, o que pode limitar seu público.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top