2012-03-29 4 views
6

저는 C#을 사용하여 게임을 프로그래밍하므로 성능에 대해 매우 우려하고 있습니다.클래스 VS ref 구조체

주된 차이점은 무엇이며 가능한 경우 클래스를 사용하여 데이터를 전달하거나 성능을 고려하여 참조로 전달되는 구조체를 알고 싶습니다.

퍼포먼스상의 이유로 데이터를 복사하지 않기를 바란다. (ref로 전달하는 것이 여기 값보다 훨씬 빠르다고 가정한다.)

클래스는 항상 참조로 전달되며 구조체는 값으로 전달된다는 것을 알고 있지만 참조로 구조체를 전달하는 방법에 대해 설명합니다.

내가 전달하고자하는 데이터의 예 : 앞의 예에서

public delegate void PathCompleteDelegate(List<PathFinderNode> path); 
public struct PathFinderJob{ 
    public PathCompleteDelegate callback; 
    public Vector3 start, end; 
    public PathSize unitSize; 
    public BoxCollider boxCollider; 
} 

, 클래스가 차이를 만들어 사용하는 것? 그렇다면 차이점은 무엇입니까? 이 예제에서 클래스가 구조체보다 빠르지 않습니까? 왜?

감사합니다. Joao Carlos

+1

두 방법 모두 성능 프로파일 링을 시도 했습니까? 구조체가 메소드 밖에서 범위가 지정되면 어쨌든 (힙의 클래스 내에 포함 된 것처럼) 힙에있게됩니다. 클래스 또는 ref 구조체를 메서드 호출 측면에서 동일한 성능으로 의심 할 수 있습니다. –

+0

많은 프로파일 링 경험이 없으며 Unity3D의 프로파일 러를 사용하여 빠른 프로파일 링 검사를 수행했지만 차이점을 보지 못했습니다. 그러나 프로파일 러에 내장 된 "작은 물고기"가 얼마나 좋은지는 알지 못합니다. , 또는 다른 모든 게임 관련 프로파일 링에서 일어나는 일이 전혀 없다는 것을 알 수 있습니다. –

+0

OO 언어로 게임을 프로그래밍하는 동안 구조체에 시간을 낭비하지 않을 것입니다. ** ** 성능 문제가 발생하기 전에 직면 할 수있는 문제는 게임을 마무리하지 못하는 것입니다. 클래스와 객체는 dev의 속도 IMO를 증가시킵니다. – Bitterblue

답변

4

대리인이 참조 형식 인 List을 받으면 참조로 전체 목록을 전달합니다.

큰 구조체를 값으로 전달하는 것은 확실히 참조를 전달하는 것보다 비용이 많이 듭니다. 커다란 구조체를 가지고있을 때, 구조체로 사용하는 것이 보통은 아닙니다. 클래스로 변환하는 것이 좋습니다.

어쨌든 여기에 성능 문제가 있습니까? 매우 조기에 최적화 된 것 같습니다.

+0

나는 게임을 프로그래밍하고 더 빠른 코드를 작성하는 방법을 배우고있다. 그 정확한 단계는별로 문제가되지 않습니다. 왜냐하면 대부분은 초당 1000 개가 넘는 길 찾기 요청이 없기 때문입니다. 그러나 pathfinders 노드 구조에서 이것은 100nodes * 1000pathFindingRequests까지 확장 될 수 있으며 이것에 대해 학습하면 도움이 될 것입니다. –

+0

100 노드를 1000 회 역 참조 - 즉, 100,000 역 참조, 두 번째는 아무런 문제가 없어야합니다. – zmbq

+0

그리고 그의 게임이 뒤처져있는 것으로 밝혀지면 프로파일 링은 아마도 책임이있는 몇 줄의 코드를 나타낼 것입니다. 요즘 컴퓨터는 실제로 매우 빠릅니다. – fabspro

7

나는 클래스가 항상 참조와 구조체는 값에 의해 전달 것을 전달되는 것을 알고,하지만 난 여기 참조 하여 구조체를 통과하는 이야기.

아마도 적절한 생각 일 수 있습니다. 그러나 이것은 잘못된 것입니다. ref 키워드를 사용하지 않으면 C#의 모든 값이 전달됩니다.

클래스 인스턴스는 참조 유형이며, struct 인스턴스는 값 유형입니다.

값으로 참조 유형을 전달하면 참조 사본 (작은 값)을 전달합니다. 값을 기준으로 값 유형을 전달하면 전체 데이터의 사본 (잠재적으로 큰 값)을 전달합니다.

Jon Skeet은이 모든 것에 대한 좋은 설명이 있습니다 here.

관련 문제