프로젝트 규모가 커지고 개발 단계가 후반으로 진행될수록 에셋의 크기와 수가 증가합니다. 그 결과로 다음과 같은 여러 가지 일반적인 문제가 발생합니다.
모든 개발자 입장에서 소스 컨트롤에서 대규모 프로젝트를 동기화하는 데 걸리는 시간이 점점 늘어납니다. 이로 인해 새 워크스페이스를 동기화하는 기회비용이 높아질 수 있습니다.
대규모 프로젝트에서는 각 개발자가 대량의 하드 드라이브 공간을 사용합니다.
인터넷 속도가 느린 개발자는 대규모 파일 전송과 높은 데이터 사용량 때문에 팀원들보다 동기화 시간이 더 오래 걸립니다.
소스 컨트롤 시스템이 종종 복제 작업을 수행하여 똑같은 파일의 사본을 여러 개 배포합니다.
버추얼 에셋(Virtual Assets) 을 사용하면 프로젝트 규모 확장에 따라 모든 팀원 간에 데이터를 더 빠르고 효율적으로 동기화할 수 있습니다. 버추얼 에셋 시스템의 핵심 목표는 에디터 벌크 데이터를 핵심 에셋 메타데이터와 별도로 저장하여 프로젝트에 필요한 디스크 공간을 줄이는 것입니다.
이 가이드에서는 버추얼 에셋 작동 방식과 프로젝트에서 버추얼 에셋을 사용하는 방법을 간략하게 살펴봅니다.
버추얼 에셋 작동 방식
에셋으로 작업 시 사용자는 최소한의 에셋 정보만 있으면 에디터에 에셋을 표시할 수 있습니다. 예를 들어, 텍스처를 콘텐츠 브라우저(Content Browser)에 표시하려면 섬네일 이미지와 좌표 및 스케일 같은 에디터 프로퍼티만 있으면 됩니다. 그 외에, 텍스처에 대한 .uasset
파일의 대부분은 사용자가 로드하기 위해 호출할 일이 없는 픽셀 데이터입니다.
버추얼 에셋은 이 정보를 다음과 같이 두 부분으로 분리합니다.
핵심 에셋 메타데이터 – 소스 컨트롤에서 에셋이 있는 곳에 존재하는 부분입니다.
벌크 데이터 – 에셋 데이터의 주요 부분으로 소스 컨트롤 내 별도의 위치에 있는 공유 파생 데이터 캐시(Derived Data Cache, DDC) 에 보관됩니다.
이렇게 정보를 분리한 덕분에 소스 컨트롤에서 프로젝트를 동기화할 때 핵심 에셋 데이터만 동기화할 수 있습니다. 그리고 컴퓨터에 있는 것처럼 에셋을 찾아보고 필요할 때 에셋의 벌크 데이터를 선택적으로 동기화하고 로드할 수 있습니다. 또한, 버추얼 에셋은 다양한 기능 개발 분기의 사용도 지원하므로, 실험단계 기능이 안정화될 때까지 다른 팀원에게 영향을 주지 않도록 할 수 있습니다.
버추얼 에셋의 이점
버추얼 에셋을 사용하면 다음과 같은 이점이 있습니다. 이러한 이점은 데이터 양이 증가하는 대규모 프로젝트에서 가장 잘 느낄 수 있지만, 어떤 규모의 프로젝트에든 도움이 될 수 있습니다.
더 빠른 프로젝트 동기화
개별 기여자는 필요할 때만 파일의 벌크 데이터를 동기화할 수 있습니다. 이 방식은 훨씬 적은 데이터를 사용하므로 고속 연결을 사용할 수 없을 때 유용하며, 프로젝트를 풀하는 데 필요한 동기화 시간이 줄어듭니다. 특히 에셋 백로그가 많은 라이브 서비스 게임에 유용합니다.
더 적은 데이터 저장
벌크 데이터는 개별 개발자의 하드 드라이브가 아니라 주로 중앙화된 위치의 파생 데이터 캐시 또는 소스 컨트롤에 상주합니다. 즉, 프로젝트에서 팀원이 하드 드라이브 공간을 덜 사용하게 됩니다. 절감되는 공간은 프로젝트에서 사용하는 에셋 타입에 따라 다르지만, 보통 하드 드라이브 사용이 5배 이상 감소됩니다.
복제 감소
프로젝트에 워크스페이스가 여러 개인 경우, 똑같은 파일이 많이 복제될 수 있습니다. 공유 DDC와 함께 버추얼 에셋을 사용하면, 이러한 파일 복제가 제거되어 개별 사용자 머신에서 차지하는 데이터 공간이 더 줄어듭니다.
버추얼 에셋 요구 사항
프로젝트에서 버추얼 에셋을 사용하려면 다음 요구 사항을 충족해야 합니다.
소스 컨트롤
버추얼 에셋을 사용하려면, 프로젝트를 Perforce와 통합해야 합니다. 또한, 체크인할 때 파일을 가상화해주므로 언리얼 에디터 체크인 워크플로를 사용하는 것이 좋습니다.
공유 DDC(선택 사항)
버추얼 에셋 사용에 필수는 아니지만, Perforce에 액세스하는 것보다 퍼포먼스가 더 나으므로 파생 데이터 캐시(DDC)를 사용하는 것이 좋습니다. DDC는 보통 영구 스토리지용으로 안전하지 않으므로 DDC 백엔드는 캐시 스토리지로만 사용해야 합니다.
인터넷 연결
사용자가 안정적이고 빠른 연결을 통해 공유 데이터 캐시에 합리적으로 액세스할 수 있으면 버추얼 에셋은 잘 작동합니다. 그렇지 않으면, 사용자가 현저한 멈춤 현상을 겪을 수 있으며, 차라리 모든 동기화 시간과 공간을 미리 확보하는 것이 나을 수 있습니다.
버추얼 에셋에는 '오프라인 작업' 모드도 없습니다. 즉, 인터넷 연결이 끊어진 중에도 작업하는 사용자가 있다면, 버추얼 에셋은 그런 사용자가 요청할 때 벌크 데이터를 가져올 수 없습니다. 에디터에서 크래시가 발생하지는 않지만, 필요한 벌크 데이터를 가져오려면 다시 연결해야 합니다.
버추얼 에셋 디플로이 방법
버추얼 에셋은 현재 베타 기능이며 기본적으로 비활성화되어 있습니다. 프로젝트의 DefaultEngine.ini
파일에 다음 프로퍼티를 추가하여 활성화할 수 있습니다.
[Core.ContentVirtualization]
SystemName=Default
[Core.VirtualizationModule]
BackendGraph=VABackendGraph_Example
[VABackendGraph_Example]
PersistentStorageHierarchy=(Entry=SourceControlCache)
CacheStorageHierarchy=(Entry=DDCCache)
SourceControlCache=(Type=p4SourceControl, DepotRoot="...")
DDCCache=(Type=DDCBackend)
이 세팅은 현재 지원되는 모든 에셋의 가상화를 활성화합니다. 이 시점부터 저장소에 커밋하는 모든 에셋이 자동으로 가상화됩니다. 가상화된 페이로드는 프로젝트의 Saved 디렉터리의 VirtualizedPayloads 라는 서브디렉터리에 저장됩니다.
패키지가 가상화되었는지 확인하려면 콘텐츠 브라우저에서 에셋 위로 마우스를 올립니다. 툴팁의 가상화된 데이터 보유(Has Virtualized Data) 항목이 true
이면, 해당 에셋이 버추얼 에셋 시스템을 사용하여 성공적으로 변환된 것입니다.
위의 환경설정 파일을 포함하여 버추얼 에셋 환경설정 방법에 대한 자세한 내용은 버추얼 에셋 퀵스타트 가이드를 참조하세요.
수동으로 파일을 타기팅하는 방법
파일을 변경하지 않고 에셋을 가상화하고 싶다면, 언리얼 가상화 툴(Unreal Virtualization Tool) 을 사용하여 변환합니다. 이 툴의 소스 코드는 Engine\Source\Programs\UnrealVirtualizationTool\
에 있습니다. 언리얼 가상화 툴을 컴파일한 다음, 아래의 실행인자와 함께 명령줄에서 실행합니다.
-ClientSpecName=[Workspace Name] -Mode=Changelist -Changelist=[Changelist Number]
ClientSpecName: 제출할 워크스페이스의 이름입니다.
Changelist: 가상화하고 제출할 체인지리스트입니다.
타기팅된 체인지리스트에 포함된 모든 파일은 버추얼 에셋을 사용하여 변환된 다음 제출됩니다.
프로젝트 백엔드 정의하기
백엔드 그래프 는 프로젝트의 백엔드에서 언리얼 엔진이 버추얼 에셋을 저장하는 위치를 정의합니다. 주로 다음과 같은 두 목록으로 정의됩니다.
CacheStorageHierarchy: 풀 작업 속도를 높이는 데 사용되는 빠른 백엔드입니다. 이러한 백엔드에서 페이로드를 찾는 것이 좋지만, 필수는 아닙니다.
PersistentStorageHierarchy: 느리지만 더 안정적인 백엔드입니다. 항상 영구 스토리지에서 파일을 찾을 수 있어야 합니다.
개발자가 페이로드를 풀할 때, 시스템은 CacheStorageHierarchy 백엔드를 먼저 찾아본 다음, 이러한 백엔드 중 하나에 요청된 데이터가 없으면 대안으로 PersistentStorageHierarchy를 살펴봅니다. 두 목록 중 하나에 둘 이상의 백엔드 항목이 있는 경우, 시스템은 나열된 것과 같은 순서로 처리하므로 빠른 항목부터 느린 항목 순으로 나열해야 합니다. 일반적으로 CacheStorageHierarchy에는 공유 DDC가 포함되어 있는 반면, PersistentStorageHierarchy는 소스 컨트롤 시스템을 참조합니다.
DefaultEngine.ini
파일에서 버추얼 에셋의 다른 환경설정 변수와 더불어 백엔드 그래프를 정의할 수 있습니다. 다음은 자리표시자 이름이 있는 백엔드 그래프의 예시입니다.
[VABackendGraph_Example]
PersistentStorageHierarchy=(Entry=SourceControlCache)
CacheStorageHierarchy=(Entry=DDCCache)
SourceControlCache=(Type=p4SourceControl, DepotRoot="...")
DDCCache=(Type=DDCBackend)
백엔드 그래프를 타기팅하려면 [Core.ContentVirtualization]
아래의 BackendGraph
변수를 사용하려는 그래프의 이름으로 설정합니다.
BackendGraph=VABackendGraph_FileSystem
백엔드 그래프 빌드 방법에 대한 자세한 내용은 버추얼 에셋을 위한 백엔드 그래프 페이지를 참조하세요.
버추얼 에셋 가이드라인
다음 섹션에서는 버추얼 에셋을 프로젝트에 통합하는 방법에 대한 조언을 제공합니다.
에셋 가상화 메서드
새 프로젝트를 시작하는 경우, 바로 버추얼 에셋 사용을 시작해야 합니다. 처음부터 버추얼 에셋을 사용하면 팀원이 나중에 버추얼 에셋을 추가했을 때 발생할 수 있는 문제를 겪지 않고 모든 퍼포먼스 이점을 누리며 가장 원활한 개발 환경에서 일할 수 있습니다.
기존 프로젝트에 버추얼 에셋을 추가하는 경우, 버추얼 에셋 지원을 추가하기 위해 수동, 벌크 또는 롤링 방식 중 어떤 방식을 사용할지 고려해야 합니다. 프로젝트의 범위와 프로덕션 타임라인에 따라 프로젝트에 적합한 접근 방식이 다릅니다.
벌크 가상화
전체 프로젝트를 한 번에 가상화하면 최대한 빨리 최고의 동기화 퍼포먼스를 얻을 수 있지만, 프로젝트 규모가 클수록 위험도 커집니다. 전환할 수 있게 하려면 모든 바이너리 콘텐츠를 체크인해야 합니다. 또한, 프로젝트의 모든 벌크 데이터가 한 번에 공유 DDC에 푸시되므로, 잠재적인 보안 위험이 야기됩니다. 이로 인해 프로젝트가 상당 시간 중단될 수 있으며, 특히 대규모 프로젝트의 프로덕션 후반에는 실행이 불가능할 수도 있습니다.
일괄 가상화
프로젝트가 중단되는 일이 없도록 스크립트를 사용하여 미리 결정된 체인지리스트 세트로 언리얼 가상화 툴을 주기적으로 실행하여 효과적으로 에셋을 일괄 가상화할 수 있습니다. 이를 통해 다양한 팀이나 기능을 단계적으로 처리하여 궁극적으로 글로벌하게 버추얼 에셋 사용을 적용할 수 있습니다.
수동 가상화
특정 폴더만 가상화하면 공유 DDC에 벌크 데이터가 있는 에셋을 훨씬 잘 제어할 수 있으므로, 버추얼 에셋을 단계적으로 롤아웃하기도 더 쉬워집니다. 그렇지만, 직접 주의를 기울인 기능이나 폴더의 동기화 퍼포먼스만 개선됩니다.
프로젝트 중단을 최소화하면서 즉시 최대의 이점을 누리려면, 프로젝트에서 가장 큰 에셋을 타기팅해야 합니다. 안전을 기해, 오랫동안 변경되지 않은 에셋을 타기팅할 수도 있습니다.
버추얼 에셋의 이점을 널리 적용하기 위해, 팀원이 파일을 저장하는 대로 에셋을 가상화할 수 있습니다. 이 방식은 팀에서 활발하게 작업하지 않는 에셋은 포착하지 못하지만, 버추얼 에셋이 시간이 지날수록 꾸준히 도입되게 할 수 있습니다.
가이드라인 요약
새 프로젝트를 시작하는 경우, 바로 버추얼 에셋 사용을 시작해야 합니다.
프로젝트가 프로덕션 중반이나 후반 단계라면, 프로젝트에 지장을 줄 수 있으므로 반복작업이 많은 콘텐츠에 대해서는 버추얼 에셋을 구현하지 않는 것이 좋습니다. 하지만, 팀에서 오랫동안 변경하지 않은 에셋은 안전하게 가상화할 수 있습니다.
버추얼 에셋으로 전환하면서 프로젝트의 안정성에 미치는 영향은 제한하면서도 버추얼 에셋의 이점을 누리려면 프로젝트에서 가장 큰 에셋만 타기팅하면 됩니다.
버추얼 에셋 주의 사항
버추얼 에셋이 유용하기는 하지만, 프로젝트에 복잡한 문제를 일으키거나 효율성이 떨어지는 경우도 있습니다.
추가 데이터 유효성 검사
사용자가 에셋을 제출할 때는 프라이머리 메타데이터만 변경한 경우에도 에셋의 벌크 데이터를 커밋해야 합니다. 캐시에서 데이터를 가져올 수 있는 에디터에서 이렇게 할 수 있습니다.
네트워크 및 에셋 사용
다음과 같은 사용자 네트워크 연결의 여러 요인으로 인해 버추얼 에셋 시스템의 효율성이 감소할 수 있습니다.
DDC에 대한 느린 네트워크 연결
DDC 액세스 불가
비슷한 에셋을 사용하는 사람이 거의 없음
위의 요인 중 하나라도 해당한다면, 벌크 데이터 풀 속도가 느려서 사용자가 많은 에셋 또는 모든 에셋을 로컬에서 컴파일하고 쿠킹하게 될 수 있습니다. 그런 경우 같은 디스크 공간을 사용하며 미리 동기화하는 것보다 오래 걸릴 수도 있습니다.
프라이머리 데이터 분할
가상화는 프라이머리 데이터를 두 부분으로 나누어 별도로 저장합니다. 이로 인해, 가상화하지 않은 데이터보다 데이터 이식성이 낮으며 프로젝트 데모를 출시해야 하는 경우 복잡한 문제가 생길 수 있습니다.