Detecção de colisão XNA 2D sem GetData ()

7

Atualmente, estou trabalhando em um jogo de Worms que envolve deformação do terreno. Eu costumava fazer isso .GetData(), modificando a matriz de cores e depois usando .SetData(), mas procurei alterá-la para fazer o trabalho na GPU (usando RenderTargets).

Tudo está indo bem com isso, mas eu vim para outro problema. Toda a minha detecção de colisão contra o terreno foi baseada em uma matriz de cores que representa o terreno, mas não tenho mais essa matriz de cores. Eu poderia usar .GetData()toda vez que modificar o terreno para atualizar minha matriz de cores, mas isso anularia o objetivo das minhas alterações iniciais.

O que eu ficaria bem em usar .GetData()uma vez no começo e depois modificar essa matriz com base nas alterações que eu faço no terreno mais tarde por outros meios. Eu não sei como eu faria isso, porém, alguém pode ajudar?

Benixo
fonte

Respostas:

3

Pesquisei um pouco e ainda não encontrei uma solução para me livrar de todas as chamadas GetData toda vez que meu terreno é modificado, mas encontrei maneiras de "otimizá-lo" ou pelo menos reduzir as chamadas GetData como tanto quanto possível.

  • O desenho da cratera é agrupado, o que significa que, em vez de desenhar cada um como ele é criado, eu os adiciono a uma lista e os desenho a cada poucos quadros. Isso reduz o número de chamadas GetData - uma por lote de crateras, em vez de uma por cratera.

  • Depois de desenhar crateras no destino de renderização, espero alguns quadros antes de chamar GetData para garantir que a GPU tenha processado todos os comandos de desenho. Isso minimiza as paradas do pipeline.

  • Se eu tiver uma chamada GetData pendente para fazer e mais crateras entrarem, as crateras permanecerão em lote até que a chamada GetData seja concluída. Em outras palavras, o desenho e a obtenção são sincronizados para que uma chamada GetData sempre ocorra vários quadros depois de desenhar um lote de crateras, e qualquer nova solicitação de desenho de cratera espere até depois de um GetData pendente.

Se alguém tiver outras sugestões, eu ficaria feliz em ouvi-las.

Benixo
fonte
Eu estava pensando: se o jogo é baseado em turnos, você não pode simplesmente fazer uma GetData()chamada no início de cada turno?
Jonathan Connell