Vector3対Vector2-パフォーマンス、使用法?


8

私は現在XNAをいじって、シンプルな2Dプラットフォーマーを作成しています。複数のレイヤーを追加して少し挑戦することを考えていました。

Vector2自分の位置にを使用する代わりに、を使用してVector3Zレイヤーの深さとしてのみ使用します。ただし、不明な理由[1]のVector2で演算子を使用できないVector3ため、ゲーム内の他のすべての、たとえば、加速速度オフセットを変更して、エラーなしで実行できるようにしました。Vector2position += offset

また、回転変数をからfloatに変更し、Vector3そのZ値を使用してテクスチャを回転させました。私が使用することを計画していますXし、Y規模フリップあなたはスーパーペーパーマリオ効果を得るので、私のテクスチャをします。

しかし、これらVector2のすべてをsで変更した後Vector3、私はそれについて少し気分が悪くなりました。これはゲームのパフォーマンスにどのように影響しますか?私の小さなプラットフォーマーゲームのパフォーマンスについて心配する必要はないはずですが、それだけに興味があります。

間の任意の顕著なパフォーマンスがありVector2sおよびVector3sがそれらを追加したり掛けるとき、たとえば、または呼び出すときNormalizeTransformまたはDistance


[1]余談ですが、Vector3とVector2の間の計算に演算子がないのはなぜですか?

回答:


13

間の任意の顕著なパフォーマンスがありVector2sおよびVector3sがそれらを追加したり掛けるとき、たとえば、または呼び出すときNormalizeTransformまたはDistance

はい、座標がもう1つあるため、より多くのCPUサイクルを使用します。

しかし、問題が発生することはほとんどありません。XNA 4はベクトル演算にSIMD拡張機能使用しているため(編集:Windows Phoneのみ)、そのプラットフォームでの実装は非常に最適です。非常に重いコンピューティングを実行している場合を除いて、問題が発生する可能性はほとんどありません。Vector3現在3D(または2.5D ...)を実行しているため、ポジションにはs が必要なので、時期尚早な最適化を行わないでください。これは97%悪1です。

余談ですが、Vector3とVector2の間の計算に演算子がないのはなぜですか?

数学的には意味がないからです。そのような計算から何が出てくると思いますか?たとえば、a Vector3とa を追加しようとするとどうなるでしょうかVector2

[ x1、y1、z1 ] + [ x2、y2 ] = [ x1 + x2、y1 + y2、z1 ] または [ x1、y1 + x2、z1 + y2 ]?

この場合、通常、の3番目の座標として何を必要Vector2とし、どこに追加するかを自分で決定する必要があります。たとえば、これはあいまいさを解決します。

[ X1、Y1、Z1 ] + [ X2、Y2、 0 ] = [ X1 + X2、Y1 + Y2、Z1 ]


これで、ゲームプレイの一部が2Dでしか機能しない可能性があります。2D座標のみが必要なケースがあり、計算非常に重くなる場合(例:2D物理)、Vector2コードのその特定の部分のsに固執して、いくつかの貴重なサイクルを節約できます。その後、必要に応じて2D座標と3D座標を簡単に切り替えることができます(たとえば、2D物理位置からシーンの位置を取得するなど)。

たとえば、このコンストラクタVector2Vector3使用するまで:

Vector2 v2;
Vector3 v3(v2, someDepthValue);

または、そのコンストラクタVector3Vector2使用するまで。

Vector3 v3;
Vector2 v2(v3.X, v3.Y);

1つのではドナルド・クヌースの言葉

プログラマーは、プログラムの重要ではない部分の速度について考えたり心配したりすることに膨大な時間を費やします。デバッグや保守を検討する場合、これらの効率化の試みは実際には強力な悪影響を及ぼします。小さな効率については忘れてください。たとえば、約97%の時間です。時期尚早な最適化がすべての悪の根源です。それでも、その重要な3%で機会を逃してはなりません。


私が言ったように、私はすぐにパフォーマンスについて心配する必要がないことを知っています、しかし私がこの質問を投稿させたのは私の好奇心だけでした。あいまいさについてはあなたが正しいと思います。明確な答えをありがとう:)
Rudey 2013年

@RuudLendersパフォーマンスの問題に直面した場合の対処方法の詳細を追加しました。
Laurent Couvidou 2013年

回答を編集して非常に重要なポイントを含めました:SIMDはWindows PhoneのXNAでのみ使用されます!PCの.NETランタイム(したがってXNA自体)は、SIMDをサポートしていません。Xbox 360では同等の機能もサポートされていません。–
Andrew Russell

(PCとXbox 360では、XNA Frameworkのパフォーマンスを理解することは、依然としてベクトル操作を最適化するための適切なガイドです。)
Andrew Russell

時期尚早な最適化は悪ではありません。役に立たない時期尚早の最適化だけです。早すぎるという理由ではなく役に立たないという理由でそれを除外する必要があります。
sam hocevar 2013年

3

あなたは時期尚早に最適化しようとしています。あなたが言及した操作のほとんど(正規化、変換、距離)はvector2Dが行うこととほとんど同じです。それらのコードを見ると、それらが実質的に同じであることがわかります。唯一の違いは、vector3Dに3番目の軸があることです。パフォーマンスに関しては、Vector2Dに比べれば取るに足らないものです。

あなたの副次的な質問については:
あなたは両方が異なるサイズを持つ行列/行ベクトル/列ベクトルを掛けることができないからです。


1

Vector3代わりに不必要に使用した場合の最大のパフォーマンス効果の1つは、Vector2サイズが50%増加し、キャッシュに影響があることです。

その不要な追加データは、メインメモリからCPUキャッシュにロードする必要があります。これはすごいです。

さらに、この不要なデータをロードすることにより、すぐキャッシュにロードし直さなければならない有用なデータを押し出す可能性が高まります。

適度にタイトなループでは、追加の操作を実行することによるCPUへの影響よりもキャッシュの影響が大きくなります。

また、要素を直接追加する方が高速です(.NETのさまざまな癖のため)。したがって、マイクロ最適化を行っている場合は、ベクトル演算を使用することはできません。したがって、ベクトルの最初の2つの要素のみを追加する必要がある場合は、次のようにすることができます。

v1.X += v2.X; v1.Y += v2.Y;

ただし、このようなパフォーマンスに関する考慮事項は、パーティクルエンジンや物理エンジンなどにのみ適用できます。だから、あまり心配しないでください!


それでは、SIMDのサポートが追加された場合でも、手動インライン化が最も速い方法ですか?
MikaelHögström2013年

1
@MikaelHögströmSIMD ほぼ確実に高速になりますが、Windows Phoneプラットフォームでのみ使用できます(編集とLaurent Couvidouの回答に対するコメントを参照してください)。
Andrew Russell
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.