HLOD Layer Assets Included in Cooking

안녕하세요. 저희 프로젝트를 패키징하면 HLOD Layer 애셋이 포함되는 문제가 있어, 이에 대한 해결을 위해 문의를 드립니다.

우선 현재 저희 프로젝트는 5.4 버전의 엔진을 사용하고 있지만, FSpatialHashStreamingGrid::HLODLayer 가 Game-dependency 를 갖는 문제에 대해서는 상위 버전의 엔진을 참고하여 수정하였습니다.

그래서 UWorldPartitionRuntimeSpatialHash::CreateStreamingGrid 에서 게임 연관관계가 발생하던 HLODLayer 참조 문제는 수정된 상태입니다.

그럼에도 불구하고 쿠킹 결과에 HLOD Layer 애셋이 포함되는 경우가 있습니다.

여러 차례의 쿠킹 로그를 비교한 결과 아래와 같은 결과가 나오는 것을 확인했습니다.

1. 멀티 프로세스 쿠킹을 사용하지 않으면 항상 HLOD Layer 애셋이 포함됨.

2. 멀티 프로세스 쿠킹을 사용하고 월드 파티션 맵의 스트리밍 쎌 제너레이션이 CookWorker 에서 동작하면 HLOD Layer 애셋이 포함되지 않음.

3. 멀티 프로세스 쿠킹을 사용하고 월드 파티션 맵의 스트리밍 쎌 제너레이션이 CookDirector 에서 동작하면 HLOD Layer 애셋이 포함됨.

혹시 이러한 문제와 관련된 조치가 있었는지 알 수 있을까요? 그러한 조치가 있었다면 5.4 에 반영하기 위해 어떤 커밋들을 가져오면 되는지 알고 싶습니다.

안녕하세요.

5.4 버전의 엔진에서 프로젝트 패키징 시 HLOD Layer 에셋이 포함되는 현상을 확인하던 중,

해당 문제를 수정하기 위한 커밋을 아래 링크에서 확인할 수 있었습니다.

https://github.com/EpicGames/UnrealEngine/commit/7ba1dfd

해당 CL 적용해보면 도움이 될 것 같습니다.

감사합니다.

안녕하세요.

해당 커밋에는 FSpatialHashStreamingGrid::HLODLayer의 삭제 뿐만 아니라, FRuntimePartitionDesc::HLODSetups의 에디터 전용변수 지정, FRuntimePartitionHLODSetup 내부 모든 변수 에디터 전용 변수 지정 또한 포함되어 있습니다. 이 부분까지 모두 적용하셨는지 확인 부탁드립니다.

만약 해당 변경 사항을 모두 반영하셨음에도 동일한 문제가 발생한다면 남아있는 로컬 파일들이 영향을 주었을 가능성이 있습니다. Binaries, LocalDDC, SharedDDC, Intermediate, Saved/Cooked, Saved/StagedBuilds 등 불필요한 파일을 삭제한 뒤, 깨끗한 상태에서 다시 패키징을 진행해 보시기를 권장드립니다.

또한, 혹시 모를 상황에 대비하여 HLODLayerAsset이 참조되어 있는지 확인하기 위해 레퍼런스 뷰어를 점검해 주시기를 부탁드립니다.

그럼에도 불구하고 해당 HLODLayerAsset이 패키징 과정에서 계속 포함된다면, 자세한 로그와 함께 사용하신 정확히 어떤 엔진 5.4.X 버전인지 알려주실 수 있을까요?

감사합니다.

안녕하세요 임우성님

답변이 늦어져 죄송합니다.​

문의주신 상황을 저희가 확인해보고 있는데, 말씀해주신 상황이 재현 되지 않아

이야기가 겉돌고 있는 것 같습니다.

제가 관련한 수정 히스토리를 확인해 보았을 때, ​

​UE5.4 바닐라 엔진에 git 7ba1dfd만을 반영하면 동작에 문제가 없어 보입니다.

  • ​c707fc9 는 스트리밍 레벨을 셀로 인젝션할 수 있도록 하는 월드파티션의 실험기능을 리팩토링한 코드라,
  • 그와 관련한 에디터 전용 처리는 적용하지 않았습니다.​

특정 패키지를 CookDirector​ 혹은 CookWorker로 지정해서 보낼 수 있도록 하는 방안은 따로 개발이 필요해서,

저희가 정밀한 실험을 해본 것은 아니지만…

저희쪽에서 몇차례 시도를 해보았을 때도​ 아래 현상은 발생하지 않았습니다.​

2. 멀티 프로세스 쿠킹을 사용하고 월드 파티션 맵의 스트리밍 쎌 제너레이션이 CookWorker 에서 동작하면 HLOD Layer 애셋이 포함되지 않음. 
3. 멀티 프로세스 쿠킹을 사용하고 월드 파티션 맵의 스트리밍 쎌 제너레이션이 CookDirector 에서 동작하면 HLOD Layer 애셋이 포함됨.

Cooker 코드에서 RequestCluster의 그래프 트래버설을 보고 계시는 것으로 보이는데요.

이와 관련해서 보고 계시는 ​수정사항을 알려주시면, 확인해서 말씀드리겠습니다.

감사합니다.​

상세한 현황 및 찾으신 해결책 공유 감사합니다.
마지막에 말씀주신 것과 관련하여 제 이해를 더해 말씀드리자면…
월드 파티션은 각 스트리밍 셀을 생성하는 시점에 월드 파티션과 관련한 정보를 모아 액터 디스크립터를 생성하고 이를 활용하여 어떤 셀에 어떤 액터가 배치 될 것인지 결정합니다.
HLOD Layer 에셋의 경우, 액터 디스크립터가 생성된 액터에서 레퍼런싱이 걸리며 함께 패키징 대상으로 선정된 것으로 추정됩니다.

찾으신 해결책은 결국 이 과정에서의 필터링을 강화한 수정이 아닐까 생각되네요.

후에 해당 이슈에 대한 재확인이 필요하신 경우 언제라도 편하게 댓글 혹은 새로운 글 올려주세요.

감사합니다

안녕하세요, 답변 감사합니다.

​다만, 알려주신 커밋은 이미 반영된 상태입니다.

해당 커밋을 반영하였음에도 불구하고 멀티 프로세스 쿠킹 유무에 따라 결과가 달라지고 있어서, ​CookDirector 와 CookWorker 간에 RequestCluster 에서의 Traversal 방식 차이가 원인으로 추측하고 있습니다.

관련하여 Epic 측의 답변이 궁금합니다.​

답변은 감사합니다만 제공해주시는 정보의 근거에 공감이 안되네요.

우선 FRuntimePartitionDesc - FRuntimePartitoinHLODSetup - HLODLayers 로 이어지는 부분에 대해, FRuntimePartitionDesc::HLODSetups 는 이미 에디터 전용 프로퍼티였습니다.

5.3 에서부터 계속 이어져오던 형태로 유지되었고, 5.4 최종 버전은 다음과 같습니다.

https://github.com/EpicGames/UnrealEngine/commit/5b9123f

해당 프로퍼티의 에디터 전용이 해제 된 커밋

https://github.com/EpicGames/UnrealEngine/commit/1b8b203

이 후 말씀하신 커밋에서 1b8d203 에 대한 보완 후에

https://github.com/EpicGames/UnrealEngine/commit/7ba1dfd

아래 커밋과 같이 FRuntimePartitionHLODSetup::HLODLayers 만 에디터 전용 처리한게 5.5.0 릴리즈 때부터 현재까지 이어지고 있습니다.

https://github.com/EpicGames/UnrealEngine/commit/c707fc9

따라서 말씀하신 변경사항은 1b8b203 와 7ba1dfd 사이에 변경된 내용이므로 5.4 버전을 비롯한 모든 릴리즈 버전과는 무관하다 볼 수 있습니다.

또한 일반적으로 게임을 패키징할 때 EditorDependency 를 제외하는 점을 감안하면, 실질적으로 HLODLayer 애셋이 GameDependency 를 갖는 부분은 StreamingGrid 생성단계 뿐이기에 그 부분만 말씀드렸구요.

여담으로 c707fc9 까지 모두 반영한 버전에서도 여전히 문제는 발생하는데, 앞서 말씀드린 것과 같이 결과적으로 5.4 에서 GameDependency 를 갖는 FSpatialHashStreamingGrid 만 수정하나 해당 커밋까지 반영을 하나, EditorDependency 가 어떤 형태로 쿠킹 결과에 영향을 주고 있음은 동일하기에 생략하였습니다.

개인적으로 [mention removed] 님에게 의아한 점은,

대댓글을 통해서 이 문제가 스트리밍 패키지 생성을 CookDirector / Worker 중 어느쪽에서 처리하는가에 따라 다른 결과가 나오는 정황을 발견하였다고 말씀드렸는데요.

아시다시피 애셋 쿠킹 여부는 초기 목록을 제외하면 RequestCluster 내에서 그래프 탐색 시 패키지 연관관계를 어떻게 판정하는가에 따라 달라질텐데, RequestCluster 측의 Traversal 기준이 5.6 에서 변경된 것으로 보여서 이 부분을 여쭤본 것입니다.

혹시 본문글과 대댓글의 내용을 보셨음에도 RequestCluster 의 GraphSearch 부분을 제외하는 이유가 있으실까요?

안녕하세요, 우선 답변에 감사드리며 응답이 늦어진 점 양해 부탁드립니다.

중간 응답에서 말씀드렸던 UE::cook::FRequestCluster 측 변경 사항은

https://github.com/EpicGames/UnrealEngine/commit/5cc83dc682b785996528829b00e46b5a9128fa77

입니다.

다만, 이 부분에 대해 마지막 회신 후, 애초에 에디터 참조인 패키지 데이터가 Request 단계까지 들어오는 것이 문제로 판단되어 해당 지점까지 진입하는 흐름을 확인해봤습니다.

Director 와 Worker 일 때의 분기는, UCookOnTheFlyServer::QueueDiscoveredPackage 내에서 WorkerRequests 의 타입에 따라 나뉠 것으로 보였으나, 이에 앞서 에디터 참조 패키지는 발견된 패키지로 간주하지 않아야 할 것으로 생각되어, UCookOnTheFlyServer::ProcessUnsolicitedPackages 에서의 변경 사항을 확인해봤습니다.

실제로 Instigator 의 Category 가 Unsolicited 일 때 게임 참조를 갖지 않은 경우 필터링 하는 변경 사항을 찾을 수 있었습니다.

https://github.com/EpicGames/UnrealEngine/commit/70d042ff8541deaff9ef1a88e9620fe7009d5954

위 변경 사항은, 미요청 패키지로부터 에디터 참조 패키지를 필터링하는 부분과, 이미 필터 된 내용에 대한 반복 효율을 높이기 위한 매핑 동작으로 보였습니다.

다만, 해당 변경 사항을 발견한 시점에는 저희 측 프로젝트 스케쥴로 인해, 해당 내용을 모두 적용하고 검증하기에는 무리가 있는 관계로, 약식으로 필터링만 적용 하여 확인해봤습니다.

그 결과, 본문에서 말씀드렸던 문제가 사라지는 것을 확인했습니다만, 약식 처리로 인한 부정적 영향까지 모두 체크할 시간이 부족하여 이를 프로젝트에 적용하지는 못하였습니다.

현재로서는 해당 이슈 처리에 대한 우선 순위가 낮아진 상태여서 가까운 시일 내에 추가로 확인할 예정은 없는 점에 양해 부탁드립니다.

감사합니다.

※ 위 내용을 기반으로, 에디터 참조를 필터링하기 전에는 QueueDiscoveredPackage 에서의 Cooker 영역에 따른 분기가, 스트리밍 쎌 제너레이션 시점에 HLOD Layer 애셋의 쿠킹 유무를 결정했을 것으로 추정되는데, 이 부분에 대한 정확하지는 않더라도 대략적인 원인을 알 수 있으면 더할 나위 없겠습니다 ㅠ

네 도움에 감사드립니다~!