Ich spiele gerade mit XNA herum und erstelle einen einfachen 2D-Plattformer. Ich dachte daran, mehrere Ebenen hinzuzufügen, um es ein wenig herausfordernd zu machen.
Anstatt ein Vector2
für meine Positionen zu haben, verwende ich jetzt ein Vector3
, nur um es Z
als Ebenentiefe zu verwenden. Da Sie jedoch keine Operatoren zwischen Vector2
und Vector3
aus einem unbekannten Grund verwenden können [1] , habe ich letztendlich alle anderen Vector2
s in meinem Spiel geändert, z. B. Beschleunigung , Geschwindigkeit und Versatz , damit ich Dinge wie position += offset
ohne Fehler tun kann.
Ich habe auch meine Rotationsvariable von float
auf geändert Vector3
und verwende den Z
Wert, um meine Texturen zu drehen. Ich habe vor, meine Texturen mit X
und Y
zu skalieren, damit Sie den Super Paper Mario-Effekt erhalten.
Nachdem ich all diese Vector2
s in Vector3
s geändert hatte, fühlte ich mich ein wenig schlecht dabei. Wie wirkt sich das auf die Leistung von Spielen aus? Ich weiß, ich sollte mir in meinem kleinen Plattformspiel keine Sorgen um die Leistung machen müssen, aber ich bin nur neugierig darauf.
Gibt es eine bemerkenswerte Leistung zwischen Vector2
s und Vector3
s, zum Beispiel beim Hinzufügen oder Multiplizieren sie, oder wenn Sie anrufen Normalize
, Transform
oder Distance
?
[1] Nur eine Nebenfrage: Warum gibt es keine Operatoren für Berechnungen zwischen Vector3 und Vector2?
quelle
Sie versuchen vorzeitig zu optimieren. Die meisten der von Ihnen erwähnten Operationen (Normalisieren, Transformieren, Distanzieren) sind ziemlich identisch mit denen von vector2D. Wenn Sie sich den Code ansehen, werden Sie feststellen, dass sie praktisch gleich sind. Der einzige Unterschied besteht darin, dass vector3D eine dritte Achse hat. In Bezug auf die Leistung sollte es im Vergleich zu einem Vector2D trivial sein.
Zu Ihrer Nebenfrage:
Weil Sie keine Matrizen / Zeilenvektoren / Spaltenvektoren multiplizieren können, die beide unterschiedliche Größen haben.
quelle
Einer der größten Leistungseffekte bei
Vector3
unnötiger Verwendung anstelle vonVector2
ist die 50% ige Vergrößerung und die Auswirkung auf den Cache .Diese unnötigen zusätzlichen Daten müssen aus dem Hauptspeicher in den CPU-Cache geladen werden. Das ist langsam .
Durch das Laden dieser unnötigen Daten erhöhen Sie außerdem die Wahrscheinlichkeit, dass Sie nützliche Daten herausgeben, die dann sofort wieder in den Cache geladen werden müssen .
In einer bescheiden engen Schleife überwältigen die Cache-Effekte alle CPU-Effekte, die durch zusätzliche Operationen entstehen.
Außerdem ist es schneller, die Elemente direkt hinzuzufügen (aufgrund verschiedener Macken von .NET). Wenn Sie also mikrooptimieren, werden Sie die Vektoroperationen sowieso nicht verwenden. Wenn Sie also nur die ersten beiden Elemente eines Vektors hinzufügen müssen, können Sie dies tun:
Diese Art von Leistungsüberlegungen gelten jedoch nur für Dinge wie Teilchenmotoren, Physikmotoren usw. Also mach dir nicht zu viele Sorgen!
quelle