Actualmente estoy jugando con XNA y creando un simple juego de plataformas en 2D. Estaba pensando en agregar varias capas para que sea un poco desafiante.
En lugar de tener un Vector2
para mis posiciones, ahora uso un Vector3
, solo para usarlo Z
como profundidad de capa. Sin embargo, dado que no puedes usar operadores entre Vector2
y Vector3
por alguna razón desconocida [1] , terminé cambiando todos los demás Vector2
s en mi juego, como la aceleración , la velocidad y el desplazamiento , por lo que puedo hacer cosas como position += offset
sin errores.
También cambié mi variable de rotación de float
a Vector3
, y uso el Z
valor para rotar mis texturas. Estoy planeando usar X
y Y
voltear mis texturas a escala, para que obtengas el efecto Super Paper Mario.
Sin embargo, después de cambiar todas estas Vector2
s en Vector3
s, me sentí un poco mal por eso. ¿Cómo afecta esto el rendimiento de los juegos? Sé que no debería tener que preocuparme por el rendimiento en mi pequeño juego de plataformas, pero tengo curiosidad por eso.
¿Hay alguna rendimiento notable entre Vector2
s y Vector3
s, por ejemplo, al añadir o multiplicándolos, o al llamar Normalize
, Transform
o Distance
?
[1] Solo una pregunta secundaria, ¿por qué no hay operadores para los cálculos entre Vector3 y Vector2?
fuente
Estás tratando de optimizar prematuramente. La mayoría de las operaciones que mencionó (normalizar, transformar, distancia) son prácticamente idénticas a las que hace vector2D, si puede ver su código, notará que son prácticamente iguales. La única diferencia es que vector3D tiene un tercer eje. En cuanto al rendimiento, debería ser trivial en comparación con un Vector2D.
En cuanto a su pregunta paralela:
porque no puede multiplicar matrices / vectores de fila / vectores de columna que tienen dos tamaños diferentes.
fuente
Uno de los mayores efectos de rendimiento del uso
Vector3
innecesario, en lugar deVector2
, es el aumento del 50% en el tamaño y el efecto que tiene en la memoria caché .Es necesario cargar esos datos adicionales innecesarios en la memoria caché de la CPU desde la memoria principal. Esto es muy lento .
Además, al cargar estos datos innecesarios, aumenta la posibilidad de que esté sacando datos útiles que inmediatamente deben volver a cargarse en la memoria caché.
En un bucle modestamente ajustado, los efectos de caché abrumarán cualquier efecto de CPU de realizar operaciones adicionales.
Además, es más rápido agregar los elementos directamente (debido a varias peculiaridades de .NET). Entonces, si está micro optimizando, no utilizará las operaciones vectoriales de todos modos. Entonces, si solo necesita agregar los dos primeros elementos de un vector, puede hacer esto:
Pero este tipo de consideraciones de rendimiento solo son realmente aplicables a cosas como motores de partículas, motores de física, etc. ¡Así que no te preocupes demasiado!
fuente