A Análise de desempenho do Windows Phone torna o jogo mais rápido. Razões possíveis?

7

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.

ApoorvaJ
fonte
Não tenho o conhecimento necessário para ajudar, mas talvez adicionar o código antes e depois da correção ajude outras pessoas.
21712 George George Duckett
Apenas para esclarecer, o mesmo código foi executado consistentemente mais rápido enquanto eu o executava no modo Perf Analysis. Não entendo as razões por trás disso. O fato de eu otimizar o código mais tarde é irrelevante.
precisa saber é o seguinte
11
Pode não ser irrelevante, parece que o código que você alterou foi rápido no modo Por Análise e não normalmente. Talvez você possa isolá-lo. Portanto, se você postou antes e depois, as diferenças podem ser o que o modo Análise de Desempenho faz melhor (por qualquer motivo).
George Duckett
@GeorgeDuckett: ponto válido. Estou adicionando o código.
precisa saber é o seguinte
2
Talvez seja um problema de cache. Talvez o desempenho leia as mesmas variáveis ​​que este código, mas ative algum mecanismo de cache, para que os dados do mapa estejam sempre na memória.
Tei

Respostas:

1

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.

Jogos de dadoo
fonte
Vou tentar, embora eu suspeite que esse comportamento tenha algo a ver com o cache.
ApoorvaJ
0

Não estou familiarizado com a ferramenta em si, nem sou especialista em otimização de compiladores, mas o motivo pode estar na linha:

Tile adjacent = _tiles[(int)myTarget.CurrentTile.X + x, (int)myTarget.CurrentTile.Y + y];

O que poderia acontecer aqui é que o a Tileadjacente é 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 um Tileobjeto 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 um Tileobjeto fora do loop aninhado e continuou usando-o através da função, evitando a sobrecarga de criação / destruição.

Neenster
fonte
Eu percebi esse problema desde o início e o corrigi. Não me deu um aumento notável no desempenho nem mudou a aceleração mágica no modo de análise de desempenho.
ApoorvaJ