프로퍼티 리플리케이션

액터 프로퍼티 리플리케이션 방법에 대한 상세 정보입니다.

Windows
MacOS
Linux

각 액터에는 Replicated 지정자 를 포함하는 모든 프로퍼티 목록이 유지됩니다. 서버는 리플리케이트된 프로퍼티의 값이 변할 때마다 각 클라이언트에 업데이트를 전송하며, 클라이언트는 액터의 로컬 버전에 적용합니다. 이 업데이트는 서버에서만 받으며, 클라이언트는 프로퍼티 업데이트를 서버나 다른 클라이언트로 절대 전송하지 않습니다.

클라이언트에서 리플리케이트된 변수의 값을 바꾸는 것은 추천하지 않습니다. 다음 번 서버가 변화를 감지하고 업데이트를 전송할 때까지 서버의 값과 달라지게 됩니다. 그 프로퍼티의 서버 사본이 값을 자주 변경하지 않는다면, 클라이언트가 보정을 받을 때까지 오랜 시간이 걸릴 수 있습니다.

액터 프로퍼티 리플리케이션은 신뢰성입니다. 액터의 클라이언트 버전 프로퍼티는 결국 서버의 값을 반영한다는 뜻이지만, 클라이언트가 반드시 서버에 있는 프로퍼티의 모든 개별 변경사항에 대한 알림을 받지는 못할 수도 있습니다. 예를 들어, 정수 프로퍼티의 값이 100 에서 200 을 거쳐 300 으로 빠르게 변했다면, 최종적으로 클라이언트에서 값이 300 으로 업데이트되겠지만, 중간에 200 이었음을 안다는 보장이 없습니다.

리플리케이션용 프로퍼티 구성하기

프로퍼티를 리플리케이트하려면 몇 가지 작업이 필요합니다: 프로퍼티가 정의되는 액터 클래스의 헤더에서, UPROPERTY 선언에 파라미터의 하나로 replicated 키워드를 넣어줘야 합니다:

class ENGINE_API AActor : public UObject
{
    UPROPERTY( replicated )
    AActor * Owner;
};

액터 클래스의 구현에서 GetLifetimeReplicatedProps 함수를 구현해 줘야 합니다:

void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const
{
    DOREPLIFETIME( AActor, Owner );
}

액터의 생성자에서, bReplicates 플래그가 true 로 설정되었는지 확인합니다:

AActor::AActor( const class FPostConstructInitializeProperties & PCIP ) : Super( PCIP )
{ 
    bReplicates = true;
}

Owner 멤버 변수는 이제 현재 인스턴싱된 이 액터 유형 (이 경우, 베이스 액터 클래스) 모든 사본에 대해 접속된 모든 클라이언트에 동기화될 것입니다.

네트워크 업데이트 최적화

데이터 주도형 네트워크 업데이트 빈도

액터는 NetUpdateFrequency 변수에 설정된 최대 업데이트 빈도를 살펴봅니다. 중요도 혹는 변하는 빈도가 낮은 액터에 이 값을 낮게 설정하면, 네트워크 업데이트가 보다 효율적으로 일어나게 되고, 대역폭이 제한된 상황에서 보다 부드러운 플레이 경험을 낼 수도 있습니다. 일반적인 업데이트 빈도 값은, 슈팅 게임에서 플레이어가 조종하는 액터처럼 중요하고 예측할 수 없는 경우 10 (0.1 초마다 업데이트), 협력 게임에서 AI 조종 몬스터처럼 더 느리게 움직이는 캐릭터의 경우 5 (0.2 초마다 업데이트), 게임플레이에 매우 중요하지는 않으나 네트워크를 통한 동기화는 계속 해야 하거나 서버측 로직의 조종을 받아서 리플리케이션 필요는 한 경우 2 (0.5 초마다 업데이트) 입니다.

적응형 네트워크 업데이트 빈도

기본적으로 이 기능은 비활성화됩니다. 콘솔 변수 net.UseAdaptiveNetUpdateFrequency1 로 설정하면 활성화됩니다.

Adaptive Network Update Frequency (적응형 네트워크 업데이트 빈도)를 쓰면, 보통은 실제로 변한 것이 없는 액터를 중복해서 리플리케이트하느라 낭비되는 CPU 사이클을 절약할 수 있습니다. 이 기능을 켜면, 시스템은 업데이트가 유의미한지에 따라 개별 액터의 업데이트 빈도를 동적으로 적응시킵니다. 여기서 "유의미한" 이라 함은, 액터를 초기화시키거나, (소유된 컴포넌트같은) 서브오브젝트를 추가 또는 제거하거나, 액터 또는 그 서브오브젝트의 리플리케이티드 칸의 값을 변경하거나 하는 업데이트를 말합니다. 각 액터에 가능한 업데이트 비율 범위는 액터 자체에 있는 변수 둘로 결정됩니다. 하나는 NetUpdateFrequency, 다른 하나는 MinNetUpdateFrequency 입니다. NetUpdateFrequency 는 액터가 자체 업데이트를 할 때 초당 최대 몇 번까지, MinNetUpdateFrequency 는 최소 몇 번까지 업데이트를 시도할지 나타냅니다. 이 기능을 사용하면 리플리케이션 퍼포먼스가 크게 향상될 수 있습니다.

(고급) 업데이트 빈도 감소 알고리즘

업데이트 시도 도중, 액터는 지난 번 유의미한 업데이트를 전송한 이후 얼마나 걸렸는지를 알아내고, 유의미한 업데이트를 전송한 경우 새로운 시간을 기록합니다. 업데이트 대상으로 간주되는 액터가 유의미한 업데이트를 2 초 이상 전송하지 않은 경우, 그 업데이트 빈도를 낮추기 시작하며, 유의미한 업데이트가 7 초 이상 없는 경우는 빈도를 최저까지 낮춥니다. 예를 들어, 업데이트 지연시간이 0.1 초에서 0.6 초인 액터에 유의미한 업데이트가 3 초동안 없었던 경우, 다음 업데이트 시도는 0.2 초 후에 합니다.

(고급) 업데이트 빈도 증가 알고리즘

유의미한 업데이트 전송 이후, 지난 번 유의미한 업데이트 두 번이 있었던 시간보다 30% 빠르게, 최소 / 최대 업데이트 빈도 사이로 제한시켜 다음 업데이트 일정을 잡습니다. 예를 들어, 액터의 유의미한 업데이트에 1 초가 걸린 경우, 다음 업데이트 시도는 0.7 초 (와 최소 / 최대 업데이트 빈도에 지정된 값 중 보다 가까운 시간) 후에 일어나도록 합니다. 유의미한 업데이트에 성공할 때마다 이러한 계산을 반복하여, 어느 한 액터에 데이터나 서브오브젝트 변화가 잦아지는 경우 그 업데이트 주기를 빠르게 줄일 수 있습니다.

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼