피드로 돌아가기
Is Your Game Drowning in GC Allocations? Embrace Zero-Allocation C# in Unity
Dev.toDev.to
Infrastructure

NativeArray와 Burst Compiler 기반 Zero-Allocation 구조로 GC Spike 제거

Is Your Game Drowning in GC Allocations? Embrace Zero-Allocation C# in Unity

Chathura Rathnayaka2026년 6월 12일6intermediate

Context

Unity C# 런타임의 Managed Memory 환경에서 List 등 임시 컬렉션 사용으로 인한 잦은 Garbage Collection 발생. 특히 게임의 Hot Path 내 반복적인 메모리 할당이 프레임 드롭 및 마이크로 스터터링을 유발하는 구조적 한계 노출.

Technical Solution

  • NativeArray 도입을 통한 Unmanaged Memory 영역으로의 데이터 저장소 이전
  • Allocator.Persistent 설정을 통한 초기 1회 할당 및 수동 해제 방식으로 GC 추적 대상에서 제외
  • Span 활용으로 메모리 복사 없는 Zero-copy 뷰를 생성하여 데이터 접근 효율성 극대화
  • [BurstCompile] 속성을 통한 C# 코드의 최적화된 머신 코드 변환 및 SIMD 명령어 활용
  • 데이터 구조를 Struct 기반의 Contiguous Memory 레이아웃으로 재설계하여 Cache Miss 최소화
  • 필터링 로직을 In-place 처리 방식으로 변경하여 매 프레임 발생하는 임시 리스트 생성 제거

- 매 프레임 실행되는 Update 루프 내에서 List.Clear() 및 Add() 호출 여부 검토 - 성능 임계점이 높은 수치 계산 로직을 Static 메서드로 분리하고 [BurstCompile] 적용 가능성 확인 - 대규모 엔티티 데이터 관리 시 Managed Object 대신 NativeArray 기반의 데이터 지향 구조 검토 - 메모리 슬라이싱이 필요한 경우 배열 복사 대신 Span<T> 또는 ReadOnlySpan<T> 사용 고려

원문 읽기