Atualmente, estou brincando com o XNA e criando um simples jogo de plataformas 2D. Eu estava pensando em adicionar várias camadas para torná-lo um pouco desafiador.
Em vez de ter um Vector2
para minhas posições, agora uso um Vector3
, apenas para usá-lo Z
como profundidade da camada. No entanto, como você não pode usar operadores entre Vector2
e Vector3
por algum motivo desconhecido [1] , acabei alterando todos os outros Vector2
s no meu jogo, como aceleração , velocidade e deslocamento , para que eu possa fazer coisas como position += offset
sem erros.
Também alterei minha variável de rotação de float
para Vector3
e uso o Z
valor para girar minhas texturas. Estou planejando usar X
e Y
mudar minhas texturas para que você obtenha o efeito Super Paper Mario.
No entanto, depois de alterar todos esses Vector2
s em Vector3
s, me senti um pouco mal com isso. Como isso afeta o desempenho dos jogos? Eu sei que não deveria ter que me preocupar com o desempenho no meu pequeno jogo de plataforma, mas estou curioso.
Existe algum desempenho notável entre Vector2
s e Vector3
s, por exemplo, quando adicionando ou multiplicando-os, ou ao chamar Normalize
, Transform
ou Distance
?
[1] Apenas uma pergunta secundária, por que não existem operadores para cálculos entre o Vector3 e o Vector2?
fonte
Você está tentando otimizar prematuramente. A maioria das operações que você mencionou (normalizar, transformar, distância) são praticamente idênticas às do vetor2D; se você puder ver o código delas, perceberá que elas são praticamente as mesmas. A única diferença é que o vector3D tem um terceiro eixo. Em termos de desempenho, deve ser trivial em comparação com um Vector2D.
Quanto à sua pergunta paralela:
Como você não pode multiplicar matrizes / vetores de linha / vetores de coluna com tamanhos diferentes.
fonte
Um dos maiores efeitos de desempenho do uso
Vector3
desnecessário, em vez deVector2
, é o aumento de 50% no tamanho e o efeito que afeta o cache .Esses dados extras desnecessários precisam ser carregados no cache da CPU a partir da memória principal. Isso é sloooow .
Além disso, ao carregar esses dados desnecessários, você aumenta a chance de enviar dados úteis que precisam ser carregados imediatamente de volta ao cache.
Em um loop modesto, os efeitos do cache sobrecarregam os efeitos da CPU de operações extras.
Além disso, é mais rápido adicionar os elementos diretamente (devido a várias peculiaridades do .NET). Portanto, se você estiver otimizando micro, não utilizará as operações vetoriais. Portanto, se você precisar adicionar apenas os dois primeiros elementos de um vetor, faça o seguinte:
Mas esses tipos de considerações de desempenho são realmente aplicáveis apenas a coisas como motores de partículas, motores de física etc. Então não se preocupe demais!
fonte