В настоящее время я играю с XNA и создаю простой 2D-платформер. Я думал о добавлении нескольких слоев, чтобы сделать это немного сложным.
Вместо того, чтобы иметь Vector2
для моих позиций, я теперь использую Vector3
, исключительно, чтобы использовать его в Z
качестве глубины слоя. Однако, поскольку вы не можете использовать операторы между Vector2
и Vector3
по какой-то неизвестной причине [1] , я закончил тем, что изменил все другие Vector2
s в моей игре, такие как ускорение , скорость и смещение , так что я могу делать вещи, как position += offset
без ошибок.
Я также изменил свою переменную вращения с float
на Vector3
, и я использую Z
значение, чтобы вращать мои текстуры. Я планирую использовать X
и Y
масштабировать мои текстуры, чтобы вы получили эффект Super Paper Mario.
Однако, после изменения всех этих Vector2
s в Vector3
s, я немного расстроился из-за этого. Как это влияет на производительность игр? Я знаю, что мне не нужно беспокоиться о производительности в моей маленькой платформерной игре, но мне просто интересно.
Есть ли какая - либо заметная производительность между Vector2
s- и Vector3
с, например , при добавлении или умножая их, или при вызове Normalize
, Transform
или Distance
?
[1] Просто дополнительный вопрос, почему нет операторов для вычислений между Vector3 и Vector2?
источник
Вы пытаетесь оптимизировать преждевременно. Большинство упомянутых вами операций (нормализация, преобразование, расстояние) в значительной степени идентичны тем, что делает vector2D, если вы посмотрите на их код, вы заметите, что они практически одинаковы. Единственное отличие состоит в том, что vector3D имеет третью ось. По производительности это должно быть тривиально по сравнению с Vector2D.
Что касается вашего дополнительного вопроса:
потому что вы не можете умножить матрицы / векторы строк / векторы столбцов, которые имеют разные размеры.
источник
Одним из самых значительных эффектов, связанных с использованием
Vector3
без необходимости,Vector2
является увеличение размера на 50% и влияние на кэш .Эти ненужные дополнительные данные должны быть загружены в кэш процессора из основной памяти. Это sloooow .
Кроме того, загружая эти ненужные данные, вы увеличиваете вероятность того, что вы выталкиваете полезные данные, которые затем немедленно должны быть загружены обратно в кэш.
В скромно замкнутом цикле эффекты кэширования подавляют любые эффекты процессора при выполнении дополнительных операций.
Кроме того, быстрее добавлять элементы напрямую (из-за различных особенностей .NET). Так что если вы оптимизируете микро, вы все равно не будете использовать векторные операции. Поэтому, если вам нужно только добавить первые два элемента вектора, вы можете сделать это:
Но такие соображения производительности действительно применимы только к таким вещам, как движки частиц, физические движки и так далее. Так что не волнуйтесь слишком сильно!
источник