Unreal Engine 4. Nuevo modelo de red: PushModel

En la arquitectura de red estándar de Unreal Engine, el servidor comprueba si el valor de la variable de clase Actor replicada ha cambiado y, si es diferente, el valor se sincroniza entre el servidor y el cliente. Cuando la cantidad de datos para sincronizar es pequeña, no hay problemas de rendimiento particulares.





Sin embargo, el juego a menudo puede consistir en un gran conjunto de actores y variables que deben replicarse en uno o más clientes, y esto ya puede convertirse en un área problemática.





UE ya ofrece funciones como: NetUpdateFrequency, NetCullDistanceSquared, etc. Su tarea principal es eliminar del panorama general de la replicación tantos actores como sea posible que no necesiten sincronizar datos constantemente.





PushModel es, por ahora, una característica experimental que puede permitir a los desarrolladores marcar activamente la necesidad de sincronizar una propiedad, se proporcionan varias macros para esto:





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



Estas macros establecen una variable específica para marcar la necesidad de sincronización, y el servidor, a su vez, elimina la necesidad de verificar constantemente los cambios de valor.





Cómo configurar PushModel. En primer lugar, en Build.cs, debe agregar para excluir problemas de compilación





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



En segundo lugar, marque las variables necesarias UPROPERTY (Replicated) o (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 , , .





Se pueden encontrar ejemplos de uso detallados en la clase APlayerState en el motor.





Gracias a todos por su atención y buen rato.








All Articles