2009-05-01 2 views
2

기본적으로 xna와 slimdx (Promit :)를 체크 아웃했습니다.이 구조체에는 많은 구조체가 있습니다. 이처럼 보였다 거의 모든 방법 :새 인스턴스를 생성하는 대신 값을 변경합니다.

public static Vector3 operator + (Vector3 a, Vector3 b) 

경우처럼 물건을 :

Vector3 c = new Vector3 (...) 

는 의미가 만약 내가 궁금 단지 수행

a.X += b.X 
... 

return a 

분명히 # 1 모습을 더 현명하고 합리적인,하지만 # 2는 더 빠른 새로운 Vector3을 만들지 않습니다.

# 1로 더 명확하지 않으면 빠르고 명확합니다.

어느 것이 더 낫습니까? # 2에 문제가 있습니까?

답변

0

나는 당신이이 작업을 수행하는 데 필요한 성능에 대해 너무 걱정해야한다는 것을 정말로 의아합니다. # 1하십시오.

"조기 최적화는 모든 악의 뿌리입니다." - Donald Knuth

+0

그는 게임 및 그래픽 응용 프로그램을 작업하는 경우 성능이 일반 비즈니스 응용 프로그램보다 훨씬 중요합니다. –

+1

@Reed -하지만 여전히 프로필을 작성하고 실제 병목 현상을 찾아야합니다. 그것이 다른 곳에 있다면,이 비트를 최적화하는 것이 도움이되지 않을 것입니다. –

+0

크 누스 (Knuth)는 "비즈니스 앱의 시기상의 최적화는 모든 악의 뿌리입니다."라고 말하지 않았습니다. 거기에 자격이 없다는 것을 알게 될 것입니다. 프로필을 작성하면 속도가 느려지는 부분을 찾을 수 있습니다. 그 전에는 추측을하고 코드 품질을 대폭 낮추었습니다. –

1

2의 유일한 문제점은 Vector3이 값 유형이므로 (이유는 Rico Mariani's blog을 참조하십시오), 컬렉션에 포함되거나 사용되는대로 편집 할 수 없다는 것입니다. 재산 회원. 예를 들어

, 그것은 목록을 <Vector3> 회원을 가지고 매우 일반적인, 그러나 당신이 할 경우 : 인덱서가 새로운 구조체 (value 타입 의미)를 반환 이후

myList[150].X += ...; 

이 실패합니다. 일반적으로 값 유형을 사용하면 첫 번째 구문이 필요한 불변으로 처리하는 것이 더 안전합니다.

+0

감사 리드. 나는 틀린 추측을 제목 질문했다. 전달 된 값을 변경하는 것을 의미합니다. 즉 원본이 아니라 ref 복사본으로 전달됩니다. –

+0

Joan : 일반적으로 값 유형을 불변으로 처리하는 것이 좋습니다. (.net 디자인 지침은 그 이유 때문에 클래스를 만드는 것을 제안하기도합니다). Vector3는 게임에서 일반적으로 사용되는 것이 아니지만 그럴 수 있습니다. 두 번째 구문은 유형이 변경 가능할 경우에만 작동하며 참조 유형과 유사하기 때문에 피하려고합니다. 성능. 현명한, 비록 JIT가 그들에게 도착한 후에도 일반적으로 동일합니다 (특정 상황이 다를지라도). –

+0

이 방법을 완전히 사용하는 방법을 자세히 설명해 주시겠습니까?그럼 난 내 경험 (난 C#을 사용하는 전임 3D 개발자입니다 - 그래서 내 골목의 바로 위에있어 팁) 줄 수 있습니다.) –

관련 문제