Show GN: C#에서 런타임 오버헤드를 최소화하며 가독성있는 HasFlag 코드 작성하기

17 hours ago 1

개발 배경

Unity 게임을 개발하거나 C#을 사용하며 기본 Enum의 FlagHasFlag 를 사용할 때마다 Boxing 으로 인해 가비지가 생성되는것을 쉽게 방지하기 위해 개발하게 된 패키지입니다!

작동방식

Source Generator 를 이용하여 컴파일 타임에 코드들 중 [Flag] 를 가진 enum 선언들을 찾아 커스텀 HasFlagNonAlloc 확장 메소드를 자동으로 생성합니다.

기능

거의 제로에 가까운 런타임 오버헤드로 HasFlag 코드를 가독성있게 작성할 수 있게 됩니다!

var currentState = PlayerState.Idle | PlayerState.Walking; // 기존 HasFlag (Boxing 발생) if (currentState.HasFlag(PlayerState.Idle)) { // ... } // Boxing 을 피하는 HasFlag 체크 구현 if ((currentState & PlayerState.Idle) == PlayerState.Idle) { // ... } // NonAllocFlagGenerator 설치 이후 if (currentState.HasFlagNonAlloc(PlayerState.Idle)) { // ... }

처음 만들어보는 제대로 된(?) 오픈소스 프로젝트라 부족한 점이 많지만 용기내어 올려봅니다!
성능에 민감한 코드를 작성하실 때 도움이 되면 좋겠습니다.

피드백은 얼마든지 환영입니다!

Read Entire Article