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
변환을 많이해야하는 경우 벡터 사용 방식을 변경해야 할 수도 있습니다. 두 가지 테스트를 수행하여 어느 것이 귀하에게 적합한 지 확인하십시오.
테스트로 업데이트 : 어느 것이 가장 빠른지 물었으므로 Unity에서 각각 10000000 변환을 실행하는 테스트를 만들었습니다. 이 경우 초기화 버전이 가장 빠릅니다. 그러나 항상 자신의 상황에 맞는 것을 사용해야하므로 게임에서 자신의 테스트를 실행하는 것이 좋습니다.
TestConvertByOperation 10000000 인스턴스 : 0.2714049s
TestConvertByCasting 10000000 인스턴스 : 0.286027s
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
입니다. 를 변환 할 때 Vector3
A를 Vector2
, 당신은 거의 항상 싶어 x
하고 z
,하지 x
와 y
.
Vector2 와 Vector3 는 모두 Unity 엔진 의 구조체 이므로 다른 저장소를 만들려면 스택에 저장소를 할당하면됩니다 (대상이 클래스 객체 의 속성이 아닌 경우 첫 단계를 건너 뛸 수 있는 경우 제외 ). 및 두 성분 값의 복사. 제공하는 두 가지 메커니즘 모두 정확히이 IL 코드로 컴파일 해야 합니다.
이 유형의 변환으로 성능 문제가 발생 하면 구조체 가 클래스 객체 로 변환되거나 클래스 객체 에서 변환되는 권투 문제 가있을 수 있습니다 . 이 경우 코드의 성능에 중요한 부분에서 권투 가 언제, 어떻게, 어떻게 피할 수 있는지 조사 해야합니다.
내 테스트에서 가장 좋은 방법은 수동으로 값을 할당하는 것입니다.
Vector2 vector2;
vector2.x = vector3.x;
vector2.y = vector3.y;
이것이 Mattias에서 확장 한 결과입니다.
TestConvertByOperation 10000000 인스턴스 : 0.3220527s
TestConvertByCasting 10000000 인스턴스 : 0.3226218s
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에서 테스트합니다.