Game Development
C# Generic Enum Type을 효율적으로 Int로 변환시켜보자 본문
해당 글은 https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019 의 내용을 바탕으로 제작되었습니다.
자세한 설명은 해당 링크를 통해서 확인하시면 됩니다!
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
Nexon Korea 이무림 편리하고 성능좋게 Enum 사용하기 Enum의 Boxing을 어찌할꼬?
www.slideshare.net
Enum Type 을 Generic으로 받아 Int로 변환하는 경우 Boxing이 일어나게된다.
public static int Enum32ToInt<T>(T e) where T : Enum
{
return (int)(object)e;
}
우리는 Boxing이 일어나게 되면 게임 성능에 좋지 못하다는걸 알 수 있다.
그럼 어떻게 해야 Boxing이 일어나지 않고 간단하게 처리할 수 있을까?
가장 간단한 방법인 포인터를 이용하는 방법을 알아보도록 하자
일단 기본적으로 Enum은의 value 는 int이라는 점을 기억하자
UnSafe Pointer를 사용해보자
UnSAfe Pointer란 c# 에서 Pointer를 사용할 수 있게 하는 것 이다.
C++에서 Pointer를 배운사람이라면 아래의 코드를 이해하기 쉬울 것이다.
public static class EnumConvertUtils
{
private struct Shell<T> where T : Enum
{
public int IntValue;
public T Enum;
}
public static int Enum32ToInt<T>(T e) where T : Enum
{
Shell<T> s;
s.Enum = e;
unsafe
{
int* pi = &s.IntValue;
pi += 1;
return *pi;
}
}
public static T IntToEnums32<T>(int value) where T : Enum
{
var s = new Shell<T>();
unsafe
{
int* pi = &s.IntValue;
pi += 1;
*pi = value;
}
return s.Enum;
}
'Unity > Performance' 카테고리의 다른 글
Unity Dictionary ContainsKey 와 TryGetValue 비교 (0) | 2021.07.01 |
---|---|
Unity GetComponent 위치에 따른 비용 비교 (0) | 2021.07.01 |
Unity 자식 클래스 참조 성능 비교 (0) | 2021.06.29 |
Unity Update 호출할 때, 사용되는 비용! (0) | 2021.06.26 |
Unity 반복문 성능 비교 (0) | 2021.06.25 |
Comments