Game Development

C# Generic Enum Type을 효율적으로 Int로 변환시켜보자 본문

Unity/Performance

C# Generic Enum Type을 효율적으로 Int로 변환시켜보자

Dev Owen 2022. 10. 5. 02:28

해당 글은 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;
    }

 

Comments