Multi-Process AssetBundle Building은 이전 Unity 버전과 비교하여 에셋 번들의 구축 방식을 크게 개선한 옵션입니다. 2023.1에 도입된 이 기능은 처음에는 기존 빌드 코드와 함께 제공되었으며 기본적으로 비활성화되었습니다. 새로운 기능은 BuildPipeline.BuildAssetBundles()로 구축된 에셋 번들에만 적용되며, 어드레서블로 구축된 에셋 번들에는 적용되지 않습니다.
이 기능은 빌드 성능을 개선하고 에셋 번들에 대한 몇 가지 오래된 문제를 해결합니다. 도입을 용이하게 하기 위해 출력에서 높은 수준의 호환성을 제공하며 기존 API를 통해 사용할 수 있습니다.
새로운 메커니즘은 에셋 데이터베이스를 사용하여 여러 개의 병렬 임포트를 수행하고 중간 파일을 캐싱합니다. 많은 경우 이 기능을 활성화하면 클린 빌드가 더 빨라지며, 증분 빌드는 훨씬 더 빠르고 정확할 수 있습니다. 또한 액셀러레이터를 사용하여 컴퓨터 간에 빌드 결함을 공유해서 한 컴퓨터의 빌드가 다른 컴퓨터에서 비슷한 빌드를 가속화하도록 할 수 있습니다. 자세한 내용은 병렬 임포트를 참조하십시오.
멀티 프로세스 빌드를 활성화하면 셰이더 컴파일 작업도 자체 전용 빌드 단계로 이동하므로 다른 빌드 단계에 비해 셰이더 컴파일에 소요되는 시간을 더 명확하게 확인할 수 있습니다.
사용자 인터페이스에서 새 기능을 활성화하려면 다음 단계를 따르십시오.
설정은 EditorBuildSettings.UseParallelAssetBundleBuilding을 사용하여 스크립팅에 노출됩니다.
빌드 콜백을 사용하는 기존 프로젝트를 Multi-Process AssetBundle Building과 함께 작동하도록 조정하는 경우 빌드 콜백 코드를 변경해야 할 수 있습니다.
빌드 중에 씬 파일이 로드되고 출력 포맷으로 다시 저장됩니다. 이 시간 동안 스크립트 코드가 실행될 수 있으며, 예를 들어 IProcessSceneWithReport.OnProcessScene 빌드 콜백을 통해 실행할 수 있습니다. Multi-Process AssetBundle Building을 사용하는 경우 이 스크립트 코드는 ScriptedImporter가 실행되는 방식과 유사하게 AssetDatabase 워커 프로세스의 임포트 작업 컨텍스트에서 실행됩니다.
로드된 씬의 상태와 완전히 연동되는 씬 콜백의 경우 AssetDatabase 임포터의 일부로 실행하는 데 문제가 없습니다. 하지만 특정 상황에서는 문제가 발생할 수 있습니다.
에셋 변경: 빌드 콜백 내에서 외부 에셋을 생성하거나 삭제하거나 수정해서는 안 됩니다. 이제 에셋을 변경하는 AssetDatabase API에 대한 호출을 방지하는 특정 보호 기능이 제공됩니다. 이러한 호출이 수행되면 오류 메시지가 포함된 스크립팅 예외가 발생합니다.
종속성 추적: 일부 상황에서 빌드 콜백이 씬 외부에서 다른 에셋의 콘텐츠를 읽는 데 필요합니다. 씬에서 해당 에셋도 명시적으로 참조하는 경우 이는 추가 변경 없이 올바르게 작동합니다. 그렇지 않으면 새로운 BuildPipelineContext.DependOnAsset 호출을 사용하여 종속성이 추적되도록 빌드 콜백 구현을 업데이트해야 합니다. 그렇지 않으면 향후 증분 빌드가 오래된 캐시된 아티팩트를 재사용할 수 있으며, 콜백 스크립트가 호출되지 않습니다.
싱글톤 및 전역 상태: 새로운 빌드 시스템의 멀티 프로세스 특성으로 인해 씬과 기타 에셋은 메인 Unity 프로세스 내에서 순서대로 로드되지 않고 다른 워커 프로세스에서 로드됩니다. 즉, 싱글톤과 같이 전역 데이터에 대한 공유 액세스를 사용하는 코드가 작동을 멈출 수 있습니다. 씬에 직접 저장되거나 에셋 내부 또는 임시 파일 내에 저장된 데이터를 사용하려면 공유 메모리에 종속된 코드를 다시 작업해야 할 수 있습니다.
캐싱으로 인해 증분 빌드는 씬 또는 다른 종속성이 마지막 빌드 이후 변경된 경우에만 빌드 콜백을 호출합니다. 스크립트 콜백이 변경되어 다시 실행되어야 하는 경우 콜백의 BuildCallbackVersion 속성을 강제로 증가시킬 수 있습니다. 해당 속성을 지정하지 않는 콜백의 경우 기본 버전 번호는 1입니다.
참고: 빌드 중에 스크립팅 코드를 호출할 수 있는 다른 상황이 있습니다. 예를 들어, ExecuteInEditMode 속성이 있는 MonoBehaviour 파생 클래스의 Awake 메서드가 있습니다. AssetDatabase 임포트 중에 허용되지 않은 작업을 수행하는 코드가 있는 경우 해당 코드를 변경해야 할 수 있습니다. 팁: BuildPipeline.isBuildingPlayer API는 에셋 번들 빌드 중에 true를 반환하므로 조건부 로직을 추가하는 데 사용할 수 있습니다. 예를 들어 빌드 중에 문제가 있는 코드를 실행하지 않도록 하되 플레이 모드에 진입할 때는 계속 허용할 수 있습니다.
에셋 번들 문제 주제에 언급된 일반적인 기법과 툴 외에도 Preference 창에서 사용할 수 있는 몇 가지 진단 플래그는 에셋 번들 빌드에 대한 상세 정보를 수집하는 데 도움이 될 수 있습니다. 이러한 플래그는 고급 사용을 위해 마련되었으며 향후 변경되거나 제거될 수 있습니다.
BuildPipelineBinaryBackwardCompatibilityMode 진단 플래그는 멀티 프로세스 에셋 번들 빌드 전용입니다. 활성화하면 특정 동작이 기존 에셋 번들 빌드 로직의 동작과 더 일치하도록 변경됩니다. 경우에 따라 이 플래그를 활성화하면 멀티 프로세스 프로젝트 설정이 꺼진 상태에서 수행된 빌드와 정확히 일치하는 바이너리 콘텐츠가 있는 에셋 번들이 생성됩니다. 이 플래그는 기본적으로 꺼져 있습니다. 에셋 번들 콘텐츠의 차이 대부분이 의도적으로 개선된 결과이며, 향후 호환성 모드가 제거될 수 있기 때문입니다. 하지만 이 플래그는 에셋 번들 콘텐츠를 최소화하는 것이 중요할 수 있는 기존 프로젝트에서 유용할 수 있습니다.
BuildPipelineTEPCapture 진단 플래그가 활성화되면 BuildPipeline.BuildAssetBundles 호출은 ‘추적 이벤트’ 포맷의 프로파일러 파일을 생성합니다. 이 파일을 사용하여 각 AssetDatabase 워커 프로세스에서 수행된 단계를 비롯하여 빌드가 수행한 단계를 자세히 확인할 수 있습니다.
이 파일은 각 빌드에 대해 덮어쓰기되며 경로 Logs/BuildAssetBundlesTEP.json에서 찾을 수 있습니다. 이는 Chrome Tracing이 지원하는 파일 포맷입니다. 자세한 내용은 추적 이벤트 포맷을 참조하십시오. 콘텐츠를 보려면 Google Chrome 또는 다른 Chromium 기반 브라우저의 chrome://tracing 툴을 사용하여 콘텐츠를 엽니다.
BuildPipelineWriteDebugFiles 플래그는 멀티 프로세스 에셋 번들 빌드 전용입니다. 활성화하면 빌드가 추가 JSON 포맷 파일을 Temp/BuildInstructions 폴더에 작성합니다. 이러한 파일은 테스트 및 디버깅 목적으로만 유용하며, 빌드 자체로 인해 요구되거나 소모되지 않습니다. 버그 보고서를 Unity로 전송할 때 특히 프로젝트 전체를 제출할 수 없는 경우 이러한 파일을 제공하는 것이 유용할 수 있습니다.