Unreal Engine 4. Neues Netzwerkmodell: PushModel

In der Standardnetzwerkarchitektur der Unreal Engine prüft der Server, ob sich der Wert der replizierten Actor-Klassenvariablen geändert hat. Wenn ein Unterschied besteht, wird der Wert zwischen dem Server und dem Client synchronisiert. Wenn die zu synchronisierende Datenmenge gering ist, treten keine besonderen Leistungsprobleme auf.





Ein Spiel kann jedoch häufig aus einer großen Anzahl von Akteuren und Variablen bestehen, die auf einen oder mehrere Clients repliziert werden müssen, und dies kann bereits zu einem Problembereich werden.





UE bietet bereits Funktionen wie: NetUpdateFrequency, NetCullDistanceSquared usw. Die Hauptaufgabe besteht darin, so viele Akteure wie möglich aus dem allgemeinen Replikationsbild zu entfernen, die nicht ständig Daten synchronisieren müssen.





PushModel ist derzeit eine experimentelle Funktion, mit der Entwickler die Notwendigkeit der Synchronisierung einer Eigenschaft aktiv markieren können. Hierzu stehen mehrere Makros zur Verfügung:





#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) 
      
      



Diese Makros legen eine bestimmte Variable fest, um die Notwendigkeit einer Synchronisierung zu kennzeichnen, und der Server beseitigt wiederum die Notwendigkeit, ständig nach Wertänderungen zu suchen.





So richten Sie PushModel ein. Zunächst müssen Sie in Build.cs hinzufügen, um Kompilierungsprobleme auszuschließen





PublicDependencyModuleNames.AddRange(new string[]  {"NetCore"});
      
      



Zweitens markieren Sie die erforderlichen Variablen UPROPERTY (Replicated) oder (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 , , .





Detaillierte Verwendungsbeispiele finden Sie in der APlayerState-Klasse in der Engine.





Vielen Dank für Ihre Aufmerksamkeit und gute Zeit.








All Articles