Um jogo XNA que eu estava fazendo estava rodando lentamente no meu dispositivo WP7. No entanto, quando eu o iniciei no Windows Phone Performance Analysis para encontrar o gargalo, o jogo correu sem problemas no mesmo dispositivo.
Eu descobri o problema um pouco mais tarde, e era uma função de verificação de adjacência. Otimizei a função e o jogo funciona bem agora.
Por que o jogo estava acelerando magicamente no modo Perf Analysis? Alguma explicação possível?
Este foi o código que correu mais rápido no modo Perf Analysis, mas lento caso contrário. É uma função de causar dano em um jogo de defesa de torre.
foreach (Target myTarget in _targets)
{
for (int x = -1; x <= 1; x++)
{
for (int y = -1; y <= 1; y++)
{
if (x == 0 && y == 0) continue;
try
{
Tile adjacent = _tiles[(int)myTarget.CurrentTile.X + x, (int)myTarget.CurrentTile.Y + y];
if (adjacent.Tower != null)
{
DealDamage(myTarget, adjacent.Tower);
}
}
catch
{
}
}
}
}
Eu o otimizei mais tarde, verificando o dano de cada torre em vez de cada alvo.
xna
performance
windows-phone-7
ApoorvaJ
fonte
fonte
Respostas:
Meu palpite é que a sobrecarga try / catch para cada iteração de um loop aninhado potencialmente grande estava prejudicando seu desempenho e que a ferramenta de análise de alguma forma afetou a sobrecarga do manipulador de exceções. Você pode testar isso facilmente removendo a manipulação de exceção e executando normalmente, sem o criador de perfil.
Você definitivamente não quer tentar / pegar dentro de um loop apertado. Seria muito melhor garantir que você responda por qualquer coisa que possa gerar uma exceção no seu loop por meio de verificações condicionais ou, no mínimo, coloque o try / catch em torno do loop como um todo.
fonte
Não estou familiarizado com a ferramenta em si, nem sou especialista em otimização de compiladores, mas o motivo pode estar na linha:
O que poderia acontecer aqui é que o a
Tile
adjacente é criado na pilha, com valores copiados do bloco correto_tiles[]
(você não está usando o que seria uma referência em C ++ e não sei se eles existem em C #). Portanto, você está continuamente criando e destruindo umTile
objeto e, além disso, dentro de 2 grandes aninhados for loop. Embora esteja na pilha, isso definitivamente pode afetar a velocidade. O que talvez aconteceu foi que o modo Perf Analysis reconheceu esse cenário, pré-alocou umTile
objeto fora do loop aninhado e continuou usando-o através da função, evitando a sobrecarga de criação / destruição.fonte