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?

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.