언어:
페이지 정보
엔진 버전:
언리얼 엔진

프로퍼티 리플리케이션

언리얼 엔진

각 액터는 프로퍼티 목록을 유지하며, 각 프로퍼티마다 클라이언트로의 리플리케이션 마킹이 가능합니다. 서버측에서 변수 값이 바뀔 때마다, 서버는 클라이언트에 업데이트된 값을 보냅니다. 클라이언트측에서도 변수가 변경되었을 수 있는데, 그러한 경우 새 값으로 덮어씁니다. 프로퍼티 업데이트는 서버에서만 옵니다 (즉 클라이언트는 절대 서버에 프로퍼티 업데이트를 보내지 않습니다).

일부 (Location, Rotation, Owner 등의) 프로퍼티는 기본으로 리플리케이트됩니다. 이 프로퍼티는 기본적인 멀티플레이어 작동을 위해 프레임워크가 일반적으로 의존하는 프로퍼티입니다. 거기서, 추가적인 프로퍼티를 필요한 대로 리플리케이트하도록 마킹할 수 있습니다.

액터 프로퍼티 리플리케이션은 신뢰성입니다. 액터의 클라이언트 버전 프로퍼티는 결국 서버의 값을 반영한다는 뜻이지만, 몇몇 프로퍼티 값 변화를 생략하는 것이 가능합니다.

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

프로퍼티를 리플리케이트하려면 몇 가지 작업이 필요합니다: 프로퍼티가 정의되는 액터 클래스의 헤더에서, 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 초마다 업데이트) 입니다.

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

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

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

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

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

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