Na arquitetura de rede padrão do Unreal Engine, o servidor verifica se o valor da variável de classe Actor replicada mudou e, se houver uma diferença, o valor é sincronizado entre o servidor e o cliente. Quando a quantidade de dados a sincronizar é pequena, não há problemas de desempenho específicos.
No entanto, um jogo pode frequentemente consistir em um grande conjunto de atores e variáveis que precisam ser replicados para um ou mais clientes, e isso já pode se tornar uma área problemática.
UE já oferece recursos como: NetUpdateFrequency, NetCullDistanceSquared, etc. A principal tarefa é eliminar do quadro geral de replicação o máximo possível de atores que não precisam sincronizar dados constantemente.
PushModel é, por enquanto, um recurso experimental que pode permitir aos desenvolvedores marcar ativamente a necessidade de sincronizar uma propriedade, várias macros são fornecidas para isso:
#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)
Essas macros definem uma variável específica para marcar a necessidade de sincronização, e o servidor, por sua vez, elimina a necessidade de verificar constantemente se há alterações no valor.
Como configurar PushModel. Em primeiro lugar, em Build.cs, você precisa adicionar para excluir problemas de compilação
PublicDependencyModuleNames.AddRange(new string[] {"NetCore"});
Em segundo lugar, marque as variáveis necessárias 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 , , .
Exemplos de uso detalhados podem ser encontrados na classe APlayerState no mecanismo.
Obrigado a todos pela atenção e bom tempo.