Unreal Engineの標準ネットワークアーキテクチャでは、サーバーはレプリケートされたActorクラス変数の値が変更されているかどうかを確認し、違いがある場合は、サーバーとクライアントの間で値が同期されます。同期するデータの量が少ない場合、特にパフォーマンスの問題はありません。
ただし、ゲームは多くの場合、1つ以上のクライアントに複製する必要のあるアクターと変数の膨大なセットで構成されている可能性があり、これはすでに問題領域になっている可能性があります。
UEは、NetUpdateFrequency、NetCullDistanceSquaredなどの機能をすでに提供しています。その主なタスクは、データを絶えず同期する必要のないアクターをできるだけ多く一般的なレプリケーションの図から排除することです。
今のところ、PushModelは、開発者がプロパティを同期する必要性を積極的にマークできるようにする実験的な機能です。これには、いくつかのマクロが用意されています。
#define MARK_PROPERTY_DIRTY(Object, Property)
#define MARK_PROPERTY_DIRTY_STATIC_ARRAY_INDEX(Object, RepIndex, ArrayIndex)
#define MARK_PROPERTY_DIRTY_STATIC_ARRAY(Object, RepIndex, ArrayIndex)
#define MARK_PROPERTY_DIRTY_FROM_NAME(ClassName, PropertyName, Object)
#define MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY_INDEX(ClassName, PropertyName, ArrayIndex, Object)
#define MARK_PROPERTY_DIRTY_FROM_NAME_STATIC_ARRAY(ClassName, PropertyName, ArrayIndex, Object)
これらのマクロは、同期の必要性を示す特定の変数を設定し、サーバーは、値の変化を常にチェックする必要をなくします。
PushModelの設定方法。まず、Build.csで、コンパイルの問題を除外するために追加する必要があります
PublicDependencyModuleNames.AddRange(new string[] {"NetCore"});
次に、必要な変数UPROPERTY(Replicated)または(ReplicatedUsing)をマークします。
, GetLifetimeReplicatedProps, DOREPLIFETIME_WITH_PARAMS DOREPLIFETIME_WITH_PARAMS_FAST, DOREPLIFETIME DOREPLIFETIME_CONDITION, . :
void ASomeActor::GetLifetimeReplicatedProps(TArray< class FLifetimeProperty > & OutLifetimeProps) const
{
Super::GetLifetimeReplicatedProps(OutLifetimeProps);
FDoRepLifetimeParams SharedParams;
SharedParams.bIsPushBased = true;
SharedParams.Condition = COND_OwnerOnly;
DOREPLIFETIME_WITH_PARAMS_FAST(ASomeActor, SomeVar, SharedParams);
}
FDoRepLifetimeParams 3 :
struct ENGINE_API FDoRepLifetimeParams
{
/** Replication Condition. The property will only be replicated to connections where this condition is met. */
ELifetimeCondition Condition = COND_None;
/** * RepNotify Condition. The property will only trigger a RepNotify if this condition is met, and has been * properly set up to handle RepNotifies. */
ELifetimeRepNotifyCondition RepNotifyCondition = REPNOTIFY_OnChanged;
/** Whether or not this property uses Push Model. See PushModel.h */
bool bIsPushBased = false;
};
bIsPushBased , PushModel. , , . , :
MARK_PROPERTY_DIRTY_FROM_NAME(ASomeActor, SomeVar, this);
SomeVar = SomeValue;
, .
PushModel , , .
詳細な使用例は、エンジンのAPlayerStateクラスにあります。
ご清聴ありがとうございました。