March 31, 2014

네트워크 팁과 꼼수

저자: * John Pollard

기본 프로퍼티 리플리케이션

네이티브 코드로 리플리케이트된 프로퍼티를 처리할 때 알아두면 좋을 꼼수 몇 가지에 대해 이야기해 보고자 합니다.

프로퍼티 리플리케이션 전체에 대한 설명은 이 글의 범위를 약간 벗어나는 것이므로, 여기서는 기본에 대해 간단히 짚어보도록 하겠습니다.

프로퍼티 리플리케이션을 위해서는 몇 가지 작업을 해 줘야 합니다:

프로퍼티가 정의된 액터 클래스의 헤더에서, 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' 는 이제 연결된 모든 클라이언트의 현재 인스턴싱된 이 액터 유형(이 경우 베이스 액터 클래스)의 모든 사본에 대해 동기화될 것입니다.

조건식 프로퍼티 리플리케이션

프로퍼티가 리플리케이션 등록되고나면, 그 등록을 해제할 수 없습니다 (그래서 수명이란 것이 등장합니다). 그 이유는 가급적 많은 정보를 구워넣기 때문에, 같은 프로퍼티 세트에 대한 다수의 접속에 걸쳐 작업 공유의 이점을 활용할 수 있는 것입니다. 이를 통해 계산 시간이 많이 절약됩니다.

그러면 이 프로퍼티 리플리케이트에 대한 더욱 미세한 제어가 어떻게 가능할까요? 바로 조건식 프로퍼티 입니다.

기본적으로 각 리플리케이트된 프로퍼티에는 내장된 조건이 있는데, 그것은 변경되지 않은 경우 리플리케이트하지 않는 것입니다.

프로퍼티 리플리케이션에 대한 제어를 강화하기 위해, 부차적인 조건을 추가시킬 수 있는 특수 매크로가 있습니다.

이 매크로는 DOREPLIFETIME_CONDITION 이라 불립니다. 그 사용법에 대한 예제는 아래에서 확인할 수 있습니다:

void AActor::GetLifetimeReplicatedProps( TArray< FLifetimeProperty > & OutLifetimeProps ) const

{

DOREPLIFETIME_CONDITION( AActor, ReplicatedMovement, COND_SimulatedOnly );

}

조건 매크로에 전달된 'COND_Simu