본문 바로가기

프로그래밍

UE5 네트워크 최적화 : Net Cull Distance 분석 및 설정(코드 예제 수정)

728x90
728x90

Net Cull Distance는 플레이어와 액터 간의 거리에 따라 네트워크 복제를 제어하여 불필요한 네트워크 트래픽을 줄이는 핵심적인 기능입니다. 이번 가이드에서는 개념 설명뿐만 아니라, 블루프린트와 C++ 코드 예제를 추가하여 더욱 실질적인 도움을 드리고자 합니다.

1. Net Cull Distance란 무엇일까요?

Net Cull Distance는 액터가 특정 클라이언트에 복제되는 최대 거리를 의미합니다. 플레이어로부터 설정된 거리 이상 멀리 떨어진 액터는 해당 플레이어에게 네트워크 업데이트를 전송하지 않게 됩니다. 이는 특히 맵에 많은 액터가 존재하는 경우 네트워크 부하를 크게 줄여 게임의 전반적인 성능을 향상시키는 데 매우 효과적입니다.

2. UE5 에디터에서 Net Cull Distance 설정하기

Net Cull Distance는 언리얼 에디터에서 간단하게 설정할 수 있습니다.

  • 액터 선택: 레벨 뷰포트 또는 월드 아웃라이너에서 Net Cull Distance를 조정할 액터를 선택합니다.
  • 디테일 패널 열기: 창 > 디테일 메뉴를 클릭하여 디테일 패널을 엽니다.
  • 복제 범주 찾기: 디테일 패널에서 아래로 스크롤하여 "복제" 범주를 찾습니다.
  • Net Cull Distance 조정: "복제" 범주 내에서 "Net Cull Distance" 속성을 찾을 수 있습니다. 이 값은 언리얼 단위(cm)로 측정됩니다.
    • 값 설정: 원하는 컬 거리를 숫자 값으로 입력합니다. 예를 들어, 5000을 입력하면 액터는 50미터(5000cm) 이내의 클라이언트에만 복제됩니다.
    • 0으로 설정: 0으로 설정하면 거리와 관계없이 액터가 항상 모든 클라이언트에 복제됩니다. 이는 네트워크 성능에 심각한 영향을 미칠 수 있으므로 신중하게 사용해야 합니다.

3. Net Cull Distance 설정 시 주의 사항 및 팁

Net Cull Distance를 효과적으로 사용하기 위해서는 몇 가지 중요한 사항을 고려해야 합니다.

  • 게임 플레이와의 조화: Net Cull Distance는 게임의 특성에 맞게 조정해야 합니다.
    • 가시 거리: 플레이어가 게임 내에서 볼 수 있는 최대 거리를 고려하여 설정해야 합니다. 일반적으로 최대 가시 거리보다 약간 더 길게 설정하는 것이 좋습니다.
    • 게임 메커니즘: 장거리 상호 작용이 필요한 게임 메커니즘이 있다면 이를 고려하여 충분히 긴 거리를 설정해야 합니다.
    • 액터의 중요도: 모든 액터가 동일한 중요도를 가지는 것은 아니므로, 중요한 액터(플레이어, 주요 오브젝트 등)와 덜 중요한 액터(배경 소품 등)에 대해 서로 다른 Net Cull Distance를 적용하는 것이 좋습니다.
  • 성능과 시각적 품질의 균형: Net Cull Distance를 너무 낮게 설정하면 액터가 갑자기 나타났다 사라지는 현상(팝핑)이 발생하여 시각적으로 부자연스러울 수 있습니다. 반대로 너무 높게 설정하면 네트워크 부하가 증가합니다. 따라서 성능과 시각적 품질 사이의 적절한 균형점을 찾는 것이 중요합니다.
  • 액터 소유권: 플레이어가 소유한 액터는 일반적으로 Net Cull Distance와 관계없이 해당 플레이어에게 항상 복제됩니다.
  • "항상 관련" 속성 주의: "복제" 범주에 있는 "항상 관련" 속성을 활성화하면 Net Cull Distance 설정이 무시됩니다. 이 옵션은 네트워크 성능에 큰 영향을 미칠 수 있으므로 꼭 필요한 경우가 아니라면 사용하지 않는 것이 좋습니다.
  • 네트워크 우선 순위 활용: "네트워크 우선 순위" 설정을 통해 특정 액터의 복제 우선순위를 조절할 수 있습니다.
  • 월드 파티션과의 연관성: 월드 파티션을 사용하는 경우, 스트리밍 거리 또한 액터의 가시성과 관련성에 영향을 미치므로 함께 고려해야 합니다. 스트리밍되지 않은 액터는 Net Cull Distance와 관계없이 복제되지 않습니다.

4. 코드 예제 (블루프린트 및 C++)

이제 블루프린트와 C++를 사용하여 Net Cull Distance를 동적으로 제어하는 방법을 살펴보겠습니다.

블루프린트 예제:

액터의 블루프린트에서 "이벤트 시작 시" 이벤트와 "Set Net Cull Distance" 노드를 사용하여 Net Cull Distance를 설정할 수 있습니다.

  • "이벤트 시작 시" 이벤트 추가
  • "Set Net Cull Distance" 노드 추가
  • "새 거리" 입력 핀에 원하는 값을 연결 (Unreal Units 단위)

C++ 예제:

// MyActor.h
UCLASS()
class MYPROJECT_API AMyActor : public AActor
{
    GENERATED_BODY()

public:
    // Sets default values for this actor's properties
    AMyActor();

protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override;

public:
    // Called every frame
    virtual void Tick(float DeltaTime) override;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Replication")
    float MyNetCullDistance = 5000.0f; // 기본 Net Cull Distance

};

// MyActor.cpp
AMyActor::AMyActor()
{
    PrimaryActorTick.bCanEverTick = true;
    SetReplicates(true); // 복제 활성화
    NetCullDistanceSquared = MyNetCullDistance * MyNetCullDistance; // 제곱값으로 설정
}

void AMyActor::BeginPlay()
{
    Super::BeginPlay();
    // 필요에 따라 BeginPlay에서 Net Cull Distance 변경 가능
    // MyNetCullDistance = 10000.0f;
    // NetCullDistanceSquared = MyNetCullDistance * MyNetCullDistance;
}

void AMyActor::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);

    // Tick 함수에서 동적으로 Net Cull Distance 변경 가능
    // 예: 특정 조건에 따라 거리 변경
    // if (SomeCondition) {
    //     MyNetCullDistance = 20000.0f;
    //     NetCullDistanceSquared = MyNetCullDistance * MyNetCullDistance;
    // }
}

C++ 코드에서는 NetCullDistanceSquared 변수를 직접 설정해야 합니다. 이는 원하는 거리의 제곱 값입니다. 생성자 또는 BeginPlay 함수에서 초기값을 설정하거나, Tick 함수에서 동적으로 값을 변경할 수 있습니다. SetReplicates(true);를 통해 액터의 복제가 활성화되어 있어야 Net Cull Distance가 적용됩니다.

5. 팁

  • Net Cull Distance는 액터의 네트워크 복제에만 영향을 미치며, 액터의 렌더링에는 영향을 미치지 않습니다. 즉, 클라이언트에 이미 복제된 액터는 다른 요인(시야, 폐색 등)에 의해 가려지지 않는 한 계속 렌더링됩니다.
  • 간혹 Net Cull Distance가 제대로 작동하지 않는 것처럼 보이는 경우가 있습니다. 이는 액터의 소유권, "항상 관련" 속성, 기타 복제 관련 설정과의 충돌 때문일 수 있으므로 관련 설정을 꼼꼼히 확인해 보는 것이 좋습니다.

 

Net Cull Distance는 UE5에서 멀티플레이어 게임의 네트워크 성능을 최적화하는 데 필수적인 요소입니다. 이 글에서 설명드린 내용과 추가된 코드 예제를 참고하여 게임의 특성에 맞는 적절한 Net Cull Distance를 설정하고, 쾌적하고 효율적인 멀티플레이어 경험을 만들어 보세요! 

 

728x90
반응형