Unreal Engine 4. Novo modelo de rede: PushModel

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.








All Articles