네트워크 객체 풀
개요
객체 풀링은 메모리 조각화를 최소화하고 CPU 및 가비지 수집기에 가해지는 부담을 줄이는 데 사용되는 일반적인 패턴입니다.
같은 이유로 NetworkRunner.Spawn()
호출 또는 NetworkRunner.Despawn()
실행 시 해제 시에 대해 새 풀을 획득할 때 NetworkObject
의 풀링을 관리하기 위해 네트워크 객체 풀을 구현하는 것이 좋습니다.
게임 세션에 사용할 객체 풀은 INetworkObjectPool
을 구현해야 합니다. 또한 시작 전에 알고 있어야 하며 NetworkRunner.StartGame()
메소드로 전달되는 StartGameArgs.ObjectPool
파라미터에 할당되어야 합니다. 객체 풀이 지정되지 않은 경우 NetworkObjectPoolDefault
가 사용됩니다.
INetworkObjectPool
객체 풀이 Fusion NetworkRunner
와 호환되려면 INetworkObjectPool
인터페이스를 구현해야 합니다. 인터페이스를 사용하려면 다음 두 가지 메소드를 구현해야 합니다:
AcquireInstance()
:NetworkRunner.Spawn()
가 호출될 때 풀에서 객체를 가져오는 데 사용ReleaseInstance()
:NetworkRunner.Destroy()
호출될 때 풀에서 객체를 해제하고 반환하는 데 사용
인터페이스를 구현하여 NetworkObject
의 Spawn()
과 Despawn()
을 Fusion이 처리하는 방식을 제어할 수 있습니다.
NetworkObjectPoolDefault
INetworkPool
구현을 지정하지 않은 경우, NetworkRunner
는 내부 기본 구현을 사용합니다. 기본 구현은 객체를 풀링 하지 않으며 대신 Spawn()
에서 처음부터 NetworkObject
를 생성하고 Despawn()
에서 인스턴스를 삭제합니다.
C#
class NetworkObjectPoolDefault : INetworkObjectPool {
public NetworkObject AcquireInstance(NetworkRunner runner, NetworkPrefabInfo info) {
if (runner.Config.PrefabTable.TryGetPrefab(info.Prefab, out var prefab)) {
return Object.Instantiate(prefab);
}
return null;
}
public void ReleaseInstance(NetworkRunner runner, NetworkObject instance, bool isSceneObject) {
Object.Destroy(instance.gameObject);
}
}
Instantiate()
및 Destroy()
는 이러한 매개 변수는 개체를 네트워크 시뮬레이션과 올바르게 동기화하기 위해 Fusion에 의해 처리됩니다. 이러한 방법을 이 컨텍스트 밖에서 직접 사용하면 네트워크 시뮬레이션의 일부가 아닌 로컬 GameObject가 생성됩니다.