Unreal Engine 4. Model jaringan baru: PushModel

Dalam arsitektur jaringan standar Unreal Engine, server akan memeriksa apakah nilai variabel kelas Aktor yang direplikasi telah berubah, dan jika ada perbedaan, nilainya disinkronkan antara server dan klien. Jika jumlah data yang akan disinkronkan kecil, tidak ada masalah kinerja tertentu.





Namun, permainan sering kali dapat terdiri dari sekumpulan besar Aktor dan variabel yang perlu direplikasi ke satu atau lebih klien, dan ini sudah bisa menjadi area masalah.





UE sudah menyediakan fitur seperti: NetUpdateFrequency, NetCullDistanceSquared, dll. Tugas utamanya adalah menghilangkan sebanyak mungkin aktor dari gambar replikasi umum yang tidak perlu terus-menerus menyinkronkan data.





PushModel, untuk saat ini, adalah fitur eksperimental yang memungkinkan pengembang secara aktif menandai kebutuhan untuk menyinkronkan properti, beberapa makro disediakan untuk ini:





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



Makro ini menetapkan variabel tertentu untuk menandai perlunya sinkronisasi, dan server, pada gilirannya, menghilangkan kebutuhan untuk terus-menerus memeriksa perubahan nilai.





Cara mengatur PushModel. Pertama-tama, di Build.cs, Anda perlu menambahkan untuk mengecualikan masalah kompilasi





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



Kedua, tandai variabel yang diperlukan UPROPERTY (Replicated) atau (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 , , .





Contoh penggunaan terperinci dapat ditemukan di kelas APlayerState di mesin.





Terima kasih atas perhatian dan waktu yang baik.








All Articles