영상을 불러오지 못했습니다

Shipping 빌드에서 EComparisonMethod를 사용하지 않는 이유

686 단어
3 분
Shipping 빌드에서 EComparisonMethod를 사용하지 않는 이유

개발 빌드에서는 정상이던 코드가 Shipping target에서 EComparisonMethod를 찾지 못했다. FunctionalTesting 모듈 의존성 때문에 컴파일·링크에 실패하는 경우도 있었다.

문제 현상#

게임 런타임 로직에서 FunctionalTest.h에 선언된 비교 enum을 편의상 재사용한 것이 시작이었다. Editor나 Development 구성에는 FunctionalTesting 모듈이 들어와 문제가 없었다. 하지만 Shipping 구성에서 developer용 테스트 코드가 빠지자 모듈 의존성 문제가 드러났다.

적용 범위#

게임의 Runtime 모듈 또는 Shipping에 포함되는 public header에서 FunctionalTesting 모듈의 타입을 참조하는 프로젝트에 해당한다. 정확한 모듈 포함 여부는 사용 중인 엔진 버전과 target rules를 기준으로 확인한다.

원인#

EComparisonMethod는 일반 수학 유틸리티가 아니라 FunctionalTesting developer 모듈의 API다. 게임 런타임 규칙이 테스트 framework 타입에 의존하면 Shipping target은 불필요한 developer 모듈까지 끌어온다. 해당 모듈이 없는 구성에서는 빌드가 실패한다.

재현 및 진단#

  1. Shipping target의 첫 컴파일 오류에서 포함 경로와 참조 타입을 확인한다.
  2. .Build.cs에서 FunctionalTesting을 Runtime 모듈이 public dependency로 요구하는지 찾아본다.
  3. public header가 FunctionalTest.h를 include하는지 검색해 둔다.
  4. Editor target에서 우연히 transitive dependency로 해결된 것은 아닌지 clean build로 검증한다.

해결 방법#

게임 실행에 필요한 의미만 남겨 프로젝트 소유의 runtime enum으로 따로 정의한다.

UENUM(BlueprintType)
enum class EGameComparisonMethod : uint8
{
Equal,
NotEqual,
Less,
LessOrEqual,
Greater,
GreaterOrEqual,
};

테스트 코드에서 두 enum을 연결해야 할 때는 별도 test/editor 모듈에 변환 함수를 둔다. 이 모듈은 FunctionalTesting에 의존해도 된다. Shipping에 테스트 기능 자체가 필요 없다면 target/configuration gate에서 관련 코드 전체를 제외한다.

검증 방법#

  • Development Editor, Development Client/Server, Shipping target을 각각 clean build한다.
  • Runtime 모듈의 dependency graph에서 FunctionalTesting이 제거됐는지 살핀다.
  • 비교 연산별 경계값과 부동소수점 tolerance 동작을 시험한다.
  • Blueprint에 노출된 기존 자산이 있다면 enum 교체 후 redirect 또는 재저장 필요성을 점검한다.

주의점#

두 enum의 이름과 항목을 복사해도 같은 ABI나 직렬화 값이 영구히 유지되지는 않는다. 저장 데이터나 network protocol에 enum 값을 기록한다면 명시적인 숫자와 versioning을 설계한다. enum 분리와 별개로 부동소수점 Equal 비교에는 tolerance가 필요할 수 있다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

Shipping 빌드에서 EComparisonMethod를 사용하지 않는 이유
https://hon454.github.io/posts/unreal-engine-functional-test-ecomparisonmethod-shipping/
작성자
Jihoon Jeon
게시일
2023-09-22
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
면접 오답노트: 말하지 못한 주요 개념, Net Relevancy
Unreal Engine면접에서 제대로 답하지 못한 Net Relevancy를 다시 정리한다. AActor::IsNetRelevantFor의 판정 순서와 문서와 다른 부분, Owner가 판정을 바꾸는 방식, 연관성을 잃고 되찾을 때 RelevantTimeout과 액터 파괴, BeginPlay, OnRep, RPC에 생기는 일, ForceNetRelevant와 Replication Graph, Iris에서의 주의점, Dormancy, Priority와의 차이를 다룬다.
2
휴면 액터 깨우기: FlushNetDormancy, ForceNetUpdate, SetNetDormancy
Unreal EngineUE 5.8.3 엔진 소스 기준으로 FlushNetDormancy, ForceNetUpdate, SetNetDormancy가 각각 무엇을 바꾸는지 비교한다. 휴면 정책과 휴면 상태의 차이, ForceNetUpdate가 덤으로 하는 flush가 빠지는 조건, 값을 바꾼 뒤 깨우면 FastArray 변경이 사라지는 문제, 이를 막는 setter 패턴과 Push Model을 함께 쓸 때의 주의점을 정리한다.
3
Unreal Engine PIE에서 클라이언트와 서버 값을 한 줄로 비교하기
Unreal EnginePIE에서 클라이언트 코드가 같은 프로세스의 서버 월드와 서버 측 PlayerController를 찾아 위치·속도를 한 줄로 비교하는 에디터 전용 디버그 코드와, 네트워크 에뮬레이션으로 확인한 측정 결과를 정리합니다.
4
Unreal Engine - Replication Graph
Unreal EngineUE 5.8.3 소스와 테스트 프로젝트 실측으로 Replication Graph가 기본 드라이버의 무엇을 줄이고 무엇을 줄이지 않는지 확인한다. 액터 5,000개와 클라이언트 16개까지의 측정, 효과가 있는 설정값과 이름과 반대로 동작하는 설정값, 커스텀 그래프의 라우팅과 Team Node, 5.8.3에서 재현한 버그 다섯 가지, 도입 기준과 Iris와의 관계를 다룬다.
5
Unreal Engine - Push Model Networking
Unreal EngineUE 5.8.3 기준으로 레거시 복제의 Push Model이 켜지는 조건, dirty 비트가 소비되는 경로, net.PushModelSkipUndirtiedReplication이 건너뛰는 범위를 엔진 소스로 확인하고, ThirdPerson 템플릿에 액터 1000개를 띄워 Unreal Insights, Networking Insights, Network Profiler로 CPU 시간, 대역폭, 비교 횟수를 측정한다. 같은 조건에서 Dormancy와도 비교한다.
무작위 게시글무작위

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
73
카테고리
10
태그
143
총 단어 수
133,527
운영 일수
0일
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.9
라이선스
CC BY-NC-SA 4.0
목차