동기식 로드
동기식 어드레서블 API는 Unity 에셋 로딩 워크플로를 미러링하는 데 도움이 됩니다. AsyncOperationHandles
에는 비동기 작업을 완료시키고 작업의 Result
를 반환하는 WaitForCompletion()
이라는 메서드가 있습니다.
WaitForCompletion
의 결과는 호출된 비동기 작업의 Result
입니다. 작업이 실패하면 default(TObject)
를 반환합니다.
작업이 실패하지 않으면 default(TObject)
를 결과로 얻을 수 있습니다. 완료 시 AsyncOperationHandle
인스턴스를 자동으로 해제하는 비동기 작업이 이러한 경우에 해당합니다. Addressables.InitializeAsync
및 autoReleaseHandle
파라미터가 true로 설정된 모든 API는 작업이 성공하더라도 default(TObject)
를 반환합니다.
성능 고려 사항
WaitForCompletion
을 호출하면 Resources.Load
또는 Instantiate
를 직접 호출하는 경우와 비교했을 때 런타임 성능에 영향을 미칠 수 있습니다. AssetBundle
이 로컬이거나 이전에 다운로드되어 캐시된 경우 이러한 성능 저하는 적습니다.
Unity가 비동기 작업을 처리하는 방식 때문에 모든 에셋 로드 작업에서 WaitForCompletion
이 호출되면 모든 활성 에셋 로드 작업이 완료됩니다. 예기치 않은 지연을 방지하려는 경우, 현재 작업 수를 알고 있고 모든 활성 작업이 동기적으로 완료되게 하려면 WaitForCompletion
을 사용하십시오.
원격 AssetBundle
을 페치 및 다운로드하는 작업에서는 WaitForCompletion
을 호출하지 마십시오.
동기식 로드 예시
void Start()
{
//Basic use case of forcing a synchronous load of a GameObject
var op = Addressables.LoadAssetAsync<GameObject>("myGameObjectKey");
GameObject go = op.WaitForCompletion();
//Do work...
Addressables.Release(op);
}
씬 제한 사항
Unity는 씬 로딩을 동기적으로 완료하지 못합니다. activateOnLoad
가 true
로 설정되어 있더라도 Addressables.LoadSceneAsync
에서 반환된 작업에 대해 WaitForCompletion
을 호출했을 때 씬이 완전히 로드되지는 않습니다. 종속성과 에셋이 완료될 때까지 기다리지만 씬 활성화는 비동기적으로 수행해야 합니다.
이 작업은 sceneHandle
을 사용하거나 SceneInstance
의 ActivateAsync
에서 AsyncOperation
을 통해 수행할 수 있습니다.
IEnumerator LoadScene(string myScene)
{
var sceneHandle = Addressables.LoadSceneAsync(myScene, LoadSceneMode.Additive);
SceneInstance sceneInstance = sceneHandle.WaitForCompletion();
yield return sceneInstance.ActivateAsync();
//Do work... the scene is now complete and integrated
}
Unity는 씬을 동기적으로 언로드하지 못합니다. 씬 언로드 시 WaitForCompleted
를 호출해도 씬이나 에셋이 언로드되지 않으며 콘솔에 경고가 기록됩니다.
SceneManager
API를 통한 메인 스레드에서의 씬 통합에는 제한이 있으므로, 씬을 로드하기 위해 WaitForCompletion
을 호출할 때 Unity 에디터 또는 플레이어를 잠글 수 있습니다. 이 문제는 두 개의 씬을 연속으로 로드할 때 발생하며, 두 번째 씬 로드 요청 시 AsyncOperationHandle
에서 WaitForCompletion
이 호출됩니다.
씬 로딩은 메인 스레드에서 완전히 통합하는 데 추가 프레임을 사용하며 WaitForCompletion
은 메인 스레드를 잠그기 때문에, SceneManager
로부터 모든 작업이 완료되지 않았는데도 첫 번째 씬이 완전히 로드되었다는 알림을 어드레서블에 받게 될 수 있습니다. 이 시점에 씬은 완전히 로드되었지만, 씬이 Single
모드에서 로드된 경우 SceneManager
는 메인 스레드에서 UnloadUnusedAssets
를 호출하려고 시도합니다. 그런 다음 두 번째 씬 로드 요청은 메인 스레드를 WaitForCompletion
으로 잠그지만, SceneManager
가 다음 씬 로드를 시작하기 전에 UnloadUnusedAssets
를 완료하도록 요청하므로 로드를 시작할 수 없습니다.
이러한 교착 상태를 방지하려면 연속된 씬을 비동기적으로 로드하거나 씬 로드 요청 사이에 지연을 추가하십시오.
커스텀 작업
어드레서블은 InvokeWaitForCompletion
의 고유한 구현을 지원하는 커스텀 AsyncOperation
인스턴스를 지원합니다. 이 메서드를 오버라이드하여 커스텀 동기식 작업을 구현할 수 있습니다.
커스텀 작업은 ChainOperation
및 GroupsOperation
인스턴스와 함께 작동합니다. 연계 작업을 동기적으로 완료하려면 커스텀 작업이 InvokeWaitForCompletion
을 구현하도록 하고 커스텀 작업을 사용하여 ChainOperation
을 생성합니다. 이와 유사하게 GroupOperations
는 커스텀 작업을 포함한 AsyncOperations
컬렉션을 완료하는 데 적합합니다.
ChainOperation
및 GroupOperation
은 모두 종속된 작업의 InvokeWaitForCompletion
구현에 의존하는 InvokeWaitForCompletion
의 자체 구현을 포함하고 있습니다.
WebGL 지원
WebGL은 WaitForCompletion
을 지원하지 않습니다. WebGL에서는 웹 요청이 모든 파일을 로드합니다. 다른 플랫폼에서는 웹 요청이 백그라운드 스레드에서 시작되고 메인 스레드는 웹 요청이 완료될 때까지 기다리는 동안 빠른 루프로 진행됩니다. 어드레서블은 웹 요청이 사용될 때 WaitForCompletion
에 대해 이렇게 작업을 수행합니다.
WebGL은 단일 스레드이기 때문에 빠른 루프로 인해 웹 요청이 차단되고 작업이 완료될 수 없습니다. 웹 요청이 생성된 프레임과 동일한 프레임에서 완료되면 WaitForCompletion
은 아무런 문제가 없습니다. 그러나 이러한 상황이 보장되지는 않습니다.