Caminho mais rápido para iterar através de uma matriz irregular?
Pergunta
Eu gostaria de iterar através de uma matriz que cobre todos os pixels da minha tela. ou seja:
for (int y = 598; y > 0; y--)
{
for (int x = 798; x > 0; x--)
{
if (grains[x][y])
{
spriteBatch.Draw(Grain, new Vector2(x,y), Color.White);
}
}
}
... Minha textura é uma imagem de 1x1 pixels que é desenhada para a tela quando o valor da matriz é verdadeiro. Ele é decente - mas definitivamente há atraso, mais a tela eu cobro. Existe uma maneira melhor de realizar o que estou tentando alcançar?
Solução
Em vez de usar sprites individuais x x y, crie uma única imagem e defina os pixels adequadamente. Em seguida, basta renderizar a imagem inteira como uma textura em um único sprite.
A matriz irregular é provavelmente não O problema - em vez dos sprites de quase meio milhão.
Outras dicas
O problema é que você está gastando muito tempo da CPU dentro do método de desenho a cada quadro. O método de desenho da sua instância do jogo sempre será chamado o mais rápido possível, seja em tempo fixo ou não. Dado isso, você sempre deseja ter certeza de que está gastando o mínimo de tempo possível lá, o que significa que deseja colocar a maior parte do trabalho na GPU.
Os loops aninhados, bem como todas as chamadas para spriteBatch.Draw
vão usar a CPU muito mais lenta, especialmente quando o seu loop fica cada vez maior, o que significa desenho atrasado.
Se você deseja fazer cálculos por pixel, por sorteio, cada quadro, a melhor maneira de fazer isso é colocar o trabalho na GPU e usar um shader de pixels. Você pode realizar seu próprio problema criando uma textura do tamanho que deseja e passando uma matriz para o shader que mantém suas informações "ligadas ou desligadas", entre outras maneiras de atingir o mesmo objetivo.