### **비동기 컨테이너 빌드 (Async Container Build)**
VContainer는 컨테이너를 빌드(build)할 때 리플렉션(Reflection)과 같은 전처리 작업을 수행합니다. 이러한 작업은 양이 많아질수록 메인 스레드를 블로킹하여 게임의 프레임 저하를 일으킬 수 있습니다. 비동기 컨테이너 빌드는 이 작업을 백그라운드 스레드에서 실행함으로써 메인 스레드의 부하를 줄이는 방법입니다.
**활성화 방법:**
1. **`LifetimeScope.autoRun` 비활성화:** `LifetimeScope` 컴포넌트의 인스펙터에서 `Auto Run` 옵션을 `false`로 설정합니다. 이렇게 하면 `LifetimeScope`가 자동으로 컨테이너를 빌드하고 초기화하는 것을 방지합니다.
2. **`LifetimeScope.Build()` 수동 호출:** 씬 로딩이 완료된 후, 코드를 통해 `LifetimeScope.Build()` 메서드를 수동으로 호출합니다. 이때, 이 `Build()` 호출을 비동기 작업으로 감싸서 백그라운드 스레드에서 실행하도록 합니다.
**예시 (UniTask 사용):**
C#
```
// 씬을 비동기적으로 로드합니다.
var nextScene = await SceneManager.LoadSceneAsync("MyGameScene");
// 로드된 씬에서 LifetimeScope를 찾습니다.
var lifetimeScope = LifetimeScope.Find<MyLifetimeScope>(nextScene.Scene);
// UniTask.Run()을 사용하여 컨테이너 빌드를 백그라운드 스레드에서 실행합니다.
await UniTask.Run(() => lifetimeScope.Build());
```
- `UniTask.Run()`은 주어진 람다 표현식(여기서는 `lifetimeScope.Build()`)을 별도의 스레드 풀에서 실행합니다.
**주의사항:**
- **Unity 의존적 기능:** `builder.RegisterComponentInHierarchy()`와 같이 Unity의 메인 스레드에 의존하는 기능(예: `GameObject`를 찾거나 생성하는 등)은 백그라운드 스레드에서 직접 작동하지 않습니다.
- **해결책: `Awake()`에서 메인 스레드 작업 수행:** 만약 `LifetimeScope`에서 `FindObjectOfType`이나 `GetComponent`와 같이 Unity API를 사용하여 `MonoBehaviour`나 `GameObject`를 찾아 등록해야 한다면, 이 작업은 `LifetimeScope`의 `Awake()` 메서드에서 수행해야 합니다. `Awake()`는 항상 메인 스레드에서 실행됩니다.
**예시:**
C#
```
class GameLifetimeScope : LifetimeScope
{
Ground groundInScene; // 씬에 있는 Ground 컴포넌트를 참조
protected override void Awake()
{
// Unity 의존적인 작업은 메인 스레드에서 실행되어야 하므로 Awake()에서 처리합니다.
groundInScene = FindObjectOfType<Ground>();
base.Awake(); // 부모 클래스의 Awake도 호출합니다.
}
protected override void Configure(IContainerBuilder builder)
{
// 이제 이 등록은 백그라운드 스레드에서 실행될 수 있습니다.
builder.RegisterInstance(groundInScene);
// 다른 순수 C# 객체 등록 등...
}
}
```
이 예시에서 `groundInScene`을 찾는 작업은 `Awake()`에서 메인 스레드에서 이루어지고, 그 결과인 `groundInScene` 인스턴스는 `Configure` 메서드에서 `builder.RegisterInstance`를 통해 백그라운드 스레드에서 컨테이너에 등록될 수 있습니다.
### 요약
VContainer에서 컨테이너 빌드 과정을 비동기적으로 처리하여 게임의 로딩 성능을 최적화하는 방법을 제시합니다. `LifetimeScope.autoRun`을 비활성화하고 `Build()`를 수동으로, 그리고 비동기적으로 호출함으로써 메인 스레드 블로킹을 줄일 수 있습니다. 다만, Unity API에 의존하는 특정 등록 작업은 메인 스레드에서 처리해야 한다는 점을 강조하며, 이를 `Awake()` 메서드에서 처리하는 해결책을 제공합니다.
---
이전 : [[8.1 Source Generator]] | 다음 : [[8.3 Parallel Container Build]]