일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 패턴
- 디자인
- ML Agent
- 디자인패턴
- LeetCode
- Algorithm
- Factory
- C++
- GetComponet
- JPS
- 성능
- 유니티
- AI
- 개발
- 프로그래밍
- desgin
- A*
- 알고리즘
- 문제풀이
- 디자인 패턴
- 게임
- 팩토리
- 강의
- 길 찾기
- pattern
- 머신러닝
- 2번
- 인공지능
- Unity
- Design
Archives
- Today
- Total
Game Development
C# Generic Enum Type을 효율적으로 Int로 변환시켜보자 본문
해당 글은 https://www.slideshare.net/devcatpublications/enum-boxing-enum-ndc2019 의 내용을 바탕으로 제작되었습니다.
자세한 설명은 해당 링크를 통해서 확인하시면 됩니다!
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