블로그로 돌아가기

Unreal Engine Dedicated Server 에셋 스트리핑(Asset Stripping) 마스터하기 (단계별 가이드)

게시일 2026년 3월 17일
Unreal Engine Dedicated Server 에셋 스트리핑(Asset Stripping) 마스터하기 (단계별 가이드)

새로 컴파일한 Unreal Engine dedicated server를 실행하며 가볍고 효율적인 headless 프로세스를 기대했지만, memory profile을 확인해보니 수천 개의 UMaterial, UTexture, USoundWave 오브젝트가 RAM을 점유하고 있는 것을 발견하게 됩니다.

공식 문서에 따르면 headless 서버는 비주얼을 렌더링하지 않습니다. 그런데 왜 서버가 수 메가바이트의 텍스처 데이터를 보유하고 있을까요?

모든 인디 개발자는 서버 호스팅 비용이 프로젝트의 생존을 위협하는 순간을 직면합니다. memory bloat 때문에 bare-metal 서버 한 대에서 50개가 아닌 10개의 게임 인스턴스만 실행할 수 있다면 backend 아키텍처에 심각한 결함이 있는 것입니다.

이 심층 분석에서는 unreal engine dedicated server asset stripping이 실제로 어떻게 작동하는지, 왜 "고스트 에셋"이 메모리에 남는지, 그리고 이를 완전히 제거하기 위해 C++와 Blueprints를 어떻게 설계해야 하는지 알아봅니다.

Dedicated Server의 "고스트 에셋" 구조

문제를 해결하려면 먼저 Unreal Automation Tool(UAT)이 Server 타겟을 위해 cook할 때 무엇을 하는지 이해해야 합니다.

Unreal Engine은 에셋을 두 부분으로 나눕니다:

  1. UObject Wrapper: 메타데이터, 프로퍼티 및 리플렉션 데이터.
  2. Bulk Data: 실제 무거운 데이터(텍스처의 DXT 압축 픽셀 데이터, 메쉬의 vertex buffers, 오디오의 PCM 데이터).

dedicated server를 cook할 때, 쿠커는 Bulk Data 스트리핑에 성공합니다. 렌더링 데이터는 사라집니다. 하지만 UObject wrapper는 남습니다.

Blueprint Class Default Object(CDO)가 UTexture2D에 대한 hard reference를 가지고 있다면, 서버는 리플렉션 시스템을 충족하고 null pointer 크래시를 방지하기 위해 UTexture2D UObject를 인스턴스화해야만 합니다. Bulk Data가 제거되어 텍스처가 10MB 대신 1KB만 소비하더라도, 50,000개의 UObject를 인스턴스화하는 오버헤드는 상당한 memory bloat와 Garbage Collection 부하로 이어집니다.

오디오와 파티클도 동일한가요?

네. USoundCueUNiagaraSystem을 hard-reference하면 서버는 UObject를 로드합니다. 무거운 PCM 데이터는 제거되지만 오브젝트는 존재합니다. 특히 파티클 시스템의 경우 CPU 로직이 포함되어 있으면 서버가 이를 tick하여 CPU 자원을 낭비할 수 있습니다.

1단계: 서버 Memory Bloat 프로파일링

측정할 수 없으면 최적화할 수 없습니다. 다음 인자값으로 서버를 실행하세요:

-LLM -LLMCSV -memoryprofiler

서버 콘솔에서 memreport -full을 실행합니다. 생성된 보고서의 Obj List에서 어떤 클래스가 메모리를 점유하는지 확인하세요.

2단계: Soft Pointers로 하드 참조 끊기

고스트 에셋의 주범은 hard references입니다. C++에서는 TSoftObjectPtr을 사용하세요. Soft references는 에셋 경로만 저장하며, 명시적으로 LoadSynchronous()를 호출하지 않는 한(클라이언트 전용) UObject는 메모리에 로드되지 않습니다.

권장: Soft Reference (서버를 깨끗하게 유지)

UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "UI")
TSoftObjectPtr<UTexture2D> HeroPortraitSoft;

3단계: NeedsLoadForServer 강제 적용

NeedsLoadForServer 함수를 오버라이드하여 false를 반환함으로써 특정 비주얼 컴포넌트를 서버에서 완전히 무시하도록 설정할 수 있습니다.

4단계: 설정을 통한 오디오 및 파티클 스트리핑

DefaultEngine.ini+DirectoriesToNeverCook을 사용하여 특정 폴더를 cook 대상에서 제외할 수 있습니다. 또한 서버의 *.Target.cs에서 bDisableAudio = true;를 설정하여 오디오 엔진을 비활성화할 수 있습니다.

Dedicated Server 메모리 최적화 베스트 프랙티스

  1. 충돌 메쉬와 비주얼 메쉬 분리: 서버에는 단순화된 UStaticMesh만 사용합니다.
  2. Construction Scripts 검토: Switch Has Authority를 사용하여 서버가 비주얼 생성을 건너뛰게 합니다.
  3. Data Assets 격리: 스탯 데이터와 비주얼 데이터를 별도의 DataAsset으로 나눕니다.
  4. CI/CD에서 메모리 프로파일링 자동화: 빌드마다 메모리 사용량을 체크합니다.

최적화된 Backend 확장

서버 메모리 점유율을 800MB에서 180MB로 줄이는 것은 기술적으로 큰 승리입니다. AWS나 Google Cloud 비용을 대폭 절감하면서 4~5배 더 많은 인스턴스를 수용할 수 있습니다.

하지만 이러한 서버를 오케스트레이션하는 것은 쉽지 않습니다. horizOn을 사용하면 최적화된 Linux 빌드를 업로드하는 것만으로 글로벌 플릿 관리와 auto-scaling을 자동으로 처리합니다.

결론

Unreal Engine의 Asset Stripping은 강력하지만 아키텍처에 의존합니다. Soft pointers로 전환하고 데이터를 분리함으로써 multiplayer 게임에 필요한 고성능을 달성할 수 있습니다.

백엔드를 확장할 준비가 되셨나요? horizOn을 무료로 체험하거나 API 문서를 확인해보세요.


출처: Stripping asset on dedicated server

이 대시보드는 다음에 의해 애정을 담아 만들어졌습니다 Projectmakers

© 2026 projectmakers.de

unknown-v1.91.1 / unknown-v--