일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- raycast
- 게임제작
- ar
- AR Foundation
- github
- Euler
- 게임개발
- callbyvalue
- 리듬게임
- AR세팅
- 레이캐스트
- 짐벌락
- Quaternion
- 유니티
- ExtensionMethod
- 소규모프로젝트
- 깃허브
- ARProgect
- 확장메서드
- 로케트
- callbyreference
- AR게임
- 리듬게임에디터
- 게임
- 델리게이트
- 병맛게임
- 인터페이스
- Unity
- C#
- 1인개발
- Today
- Total
Ssssong += Dev
[C#/유니티] (최적화) Dictionary와 Enum 본문
https://docs.unity3d.com/kr/2018.4/Manual/BestPracticeUnderstandingPerformanceInUnity4-1.html
(유니티 메뉴얼 본문 내용. enum 타입을 Dictionary의 키로 사용하면 박싱이 발생한다는 내용이 적혀 있다.)
딕셔너리 및 열거형
기본적으로 Dictionary.add(key, value)를 호출하면 Object.getHashCode(Object)가 호출됩니다.
이 메서드는 Dictionary의 키에 적절한 해시 코드를 얻기 위해서 사용되며 Dictionary.tryGetValue, Dictionary.remove 등과 같이 키를 허용하는 모든 메서드에서 사용됩니다.
Object.getHashCode 메서드는 참조 형식이지만 enum 값은 항상 값 형식입니다. 따라서 열거형 키를 가지는 Dictionary의 경우, 모든 메서드 호출은 최소한 한 번씩은 키를 박싱합니다.
enum MyEnum { a, b, c };
var myDictionary = new Dictionary<MyEnum, object>();
myDictionary.Add(MyEnum.a, new object());
이 문제를 해결하려면 IEqualityComparer 인터페이스를 구현하는 사용자 정의 클래스를 작성하고, 그 클래스의 인스턴스를 Dictionary의 비교자로 할당하면 됩니다(참고: 이 오브젝트는 보통 무소속이므로, 메모리를 절약하기 위해 다른 Dictionary 인스턴스에 대해서도 사용할 수 있습니다).
public class MyEnumComparer : IEqualityComparer<MyEnum> {
public bool Equals(MyEnum x, MyEnum y) {
return x == y;
}
public int GetHashCode(MyEnum x) {
return (int)x;
}
}
그러나 이 문제는 2017년 업데이트에서 수정된 사항이다.
닷넷 .4 이전에는 IEqualityComparer로 인해 딕셔너리 key를 enum으로 걸 경우 박싱이 일어나기 때문에 성능 저하가 있었다.
그러나 이후 EnumEqualityComparer라는 enum 전용 비교자를 만들어서 박싱 과정을 거치지 않게 되었다는 내용이다.
https://pizzasheepsdev.tistory.com/2
https://enghqii.tistory.com/69
'개발 > 공부' 카테고리의 다른 글
[유니티] memory profiler (0) | 2022.12.08 |
---|---|
[C#] [Effective C#] 생성자 내에서는 절대로 가상함수를 호출하지 말라 (0) | 2022.11.16 |
Message Queue (0) | 2022.11.03 |
[C#] ReferenceEqual (0) | 2022.11.03 |
[유니티] Gamma와 Linear (0) | 2022.11.02 |