Unreal Engine 4.新しいネットワークモデル:PushModel

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クラスにあります。





ご清聴ありがとうございました。








All Articles