Vector3をVector2に変換する最も効率的で最速の方法は何ですか?
鋳造:
Vector2 vector2 = (Vector2)vector3;
新しいVector2の初期化:
Vector2 vector2 = new Vector2(vector3.x, vector3.y);
または私が知らない別の方法はありますか?
Vector3をVector2に変換する最も効率的で最速の方法は何ですか?
鋳造:
Vector2 vector2 = (Vector2)vector3;
新しいVector2の初期化:
Vector2 vector2 = new Vector2(vector3.x, vector3.y);
または私が知らない別の方法はありますか?
回答:
Vector3 v3 = Vector3.one;
Vector2 v2 = v3;
Vector3は暗黙的にVector2に変換できます(zは破棄されます)。
http://docs.unity3d.com/ScriptReference/Vector2-operator_Vector3.html
多くの変換を行わなければならない場合は、ベクターの使用方法を変更する必要があるかもしれません。2つのテストを行い、どれが効果的かを確認するために時間を計ります。
テストで更新: あなたがどれが最も速いか尋ねたので、私はUnityでそれぞれの10000000変換を実行するテストを作成しました。この場合、初期化バージョンが最も速いようです。ただし、常に自分のコンテキストに合ったものを使用する必要があるため、ゲームで独自のテストを実行することをお勧めします。
TestConvertByOperation 10000000インスタンス:0.2714049s
TestConvertByCasting 10000000インスタンス:0.286027s
TestConvertByInitializing 10000000インスタンス:0.1458781s
using UnityEngine;
public class TestVector3Conversion : MonoBehaviour
{
readonly int iterations = 10000000;
Vector3 testVector = new Vector3(3f, 14f, 42f);
void Start()
{
Debug.Log(string.Format("TestConvertByOperation {0} instances: {1}s", iterations, TestConvertByOperation()));
Debug.Log(string.Format("TestConvertByCasting {0} instances: {1}s", iterations, TestConvertByCasting()));
Debug.Log(string.Format("TestConvertByInitializing {0} instances: {1}s", iterations, TestConvertByInitializing()));
}
float TestConvertByOperation()
{
var timeStart = Time.realtimeSinceStartup;
for (int i = 0; i < iterations; i++)
{
Vector2 v2 = testVector;
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByCasting()
{
var timeStart = Time.realtimeSinceStartup;
for (int i = 0; i < iterations; i++)
{
Vector2 v2 = (Vector2)testVector;
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByInitializing()
{
var timeStart = Time.realtimeSinceStartup;
for (int i = 0; i < iterations; i++)
{
Vector2 v2 = new Vector2(testVector.x, testVector.y);
}
return Time.realtimeSinceStartup - timeStart;
}
}
y
です。a Vector3
をに変換する場合Vector2
、ほとんどの場合x
、and z
ではなくx
andが必要y
です。
Vector2とVector3はどちらもUnityエンジンの構造体であるため、一方から他方を作成するには、単にスタックにストレージを割り当てる必要があります(宛先がクラスオブジェクトの属性でない限り、 この最初のステップをスキップできます)。 2つのコンポーネント値のコピー。どちらのメカニズムも、このILコードに合わせてコンパイルする必要があります。
この型の変換でパフォーマンスの問題が発生している場合は、構造体がクラスオブジェクトとの間で変換されるため、ボクシングの問題が発生している可能性があります。その場合、コードのパフォーマンスが重要な部分でボクシングを回避できるかどうか、いつ、どのようにして回避できるかを調査する必要があります。
私のテストから、それを行う最善の方法は、自分で値を手動で割り当てることです。
Vector2 vector2;
vector2.x = vector3.x;
vector2.y = vector3.y;
これは私がマティアスから拡張した私の結果です。
TestConvertByOperation 10000000インスタンス:0.3220527s
TestConvertByCasting 10000000インスタンス:0.3226218秒
TestConvertByInitializing 10000000インスタンス:0.1916729s
TestConvertByManualAssign 10000000インスタンス:0.09500527s
using UnityEngine;
namespace myTest
{
public class test: MonoBehaviour
{
readonly int iterations = 10000000;
Vector3 testVector = new Vector3(3f, 14f, 42f);
void Start()
{
Debug.Log(string.Format("TestConvertByOperation {0} instances: {1}s", iterations, TestConvertByOperation()));
Debug.Log(string.Format("TestConvertByCasting {0} instances: {1}s", iterations, TestConvertByCasting()));
Debug.Log(string.Format("TestConvertByInitializing {0} instances: {1}s", iterations, TestConvertByInitializing()));
Debug.Log(string.Format("TestConvertByManualAssign {0} instances: {1}s", iterations, TestConvertByManualAssign()));
}
float TestConvertByOperation()
{
var timeStart = Time.realtimeSinceStartup;
Vector2 v2;
for (int i = 0; i < iterations; i++)
{
v2 = testVector;
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByCasting()
{
var timeStart = Time.realtimeSinceStartup;
Vector2 v2;
for (int i = 0; i < iterations; i++)
{
v2 = (Vector2)testVector;
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByInitializing()
{
var timeStart = Time.realtimeSinceStartup;
Vector2 v2;
for (int i = 0; i < iterations; i++)
{
v2 = new Vector2(testVector.x, testVector.y);
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByManualAssign()
{
var timeStart = Time.realtimeSinceStartup;
Vector2 v2;
for (int i = 0; i < iterations; i++)
{
v2.x = testVector.x;
v2.y = testVector.y;
}
return Time.realtimeSinceStartup - timeStart;
}
}
}
Unityバージョン5.6.5でテストしています。