Dans l'architecture réseau standard de Unreal Engine, le serveur vérifie si la valeur de la variable de classe Actor répliquée a changé, et s'il y a une différence, la valeur est synchronisée entre le serveur et le client. Lorsque la quantité de données à synchroniser est faible, il n'y a pas de problèmes de performances particuliers.
Cependant, un jeu peut souvent être constitué d'un vaste ensemble d'acteurs et de variables qui doivent être répliqués sur un ou plusieurs clients, et cela peut déjà devenir un problème.
UE fournit déjà des fonctionnalités telles que: NetUpdateFrequency, NetCullDistanceSquared, etc. La tâche principale est d'éliminer de l'image générale de la réplication autant d'acteurs que possible qui n'ont pas besoin de synchroniser constamment les données.
PushModel est, pour l'instant, une fonctionnalité expérimentale qui peut permettre aux développeurs de marquer activement le besoin de synchroniser une propriété, plusieurs macros sont fournies pour cela:
#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)
Ces macros définissent une variable spécifique pour marquer le besoin de synchronisation, et le serveur, à son tour, supprime la nécessité de vérifier constamment les changements de valeur.
Comment configurer PushModel. Tout d'abord, dans Build.cs, vous devez ajouter pour exclure les problèmes de compilation
PublicDependencyModuleNames.AddRange(new string[] {"NetCore"});
Deuxièmement, marquez les variables nécessaires UPROPERTY (Replicated) ou (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 , , .
Des exemples d'utilisation détaillés peuvent être trouvés dans la classe APlayerState du moteur.
Merci à tous pour votre attention et votre bon temps.