[Разработка игр, Unreal Engine] Unreal Engine 4. Новая сетевая модель: PushModel
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
В стандартной сетевой архитектуре Unreal Engine, сервер проверяет, изменение значения у реплицированной переменной Actor класса, и в случае отличия, значение синхронизируется между сервером и клиентом. Когда объем данных для синхронизации не больших размеров, особых проблем с производительностью нет. Однако, игра часто может состоять из огромного множества Актеров и переменных, которые необходимо реплицировать одному или нескольким клиентам, и это уже может стать проблемным местом.UE уже предоставляет такие функции как: NetUpdateFrequency, NetCullDistanceSquared и т.д. Основная задача которых состоит в том, что бы устранить из общей картины репликации, как можно больше актеров не нуждающихся в постоянно синхронизации данных.PushModel, пока что экспериментальная фича, которая может позволить разработчикам активно отмечать необходимость синхронизации свойства, для этого предоставляется несколько макросов:
#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)
Эти макросы устанавливают определенной переменной метку необходимости синхронизации, а сервер в свою очередь убирает необходимость постоянно проверять изменение значения.Как настроить PushModel. В первую очередь в Build.cs, необходимо добавить, что б исключить проблемы компиляции
PublicDependencyModuleNames.AddRange(new string[] {"NetCore"});
Во-вторых отметить необходимые перменные UPROPERTY(Replicated) или (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 может здорово сократить количество данных, которые постоянно обрабатываются на серверной стороне, тем самым уменьшить количество потребляемых ресурсов. Подробные примеры использования можно посмотреть в классе APlayerState в движке.Всем спасибо за внимание и хорошего времяпровождения.
===========
Источник:
habr.com
===========
Похожие новости:
- [Работа с видео, Разработка игр, Управление продуктом, Продвижение игр] На чём лучше не экономить при создании ролика об игре
- [Разработка игр, Игры и игровые приставки] CD Projekt рассказала, как обходить ломающий прохождение баг в обновлении 1.1 для Cyberpunk 2077
- [Программирование, C++, Работа с 3D-графикой, Разработка игр, CGI (графика)] Vulkan. Руководство разработчика. Window surface (перевод)
- [Разработка игр, Unreal Engine, Игры и игровые приставки] Боевая система в 9 Monkeys of Shaolin. Как заново изобрести кунг-фу в видеоигре
- [Разработка под iOS, Разработка игр] HexThrees — моя первая законченная игра
- [Разработка игр, Unity, Дизайн игр] Дом в лесу. Работа с освещением в Unity 3D
- [Работа с 3D-графикой, Разработка игр, C#, Unity] Моделирование дома в SketchUp и перенос его в Unity 3D
- [Разработка игр, C#, Unity, Дизайн игр] Деревья (плагин SpeedTree) на Unity 3D
- [JavaScript, Разработка игр, Логические игры] DagazServer: Встречайте Garbo Chess
- [Open source, Разработка игр, Финансы в IT, IT-компании] Wargaming получила отказ и в Калифорнийском суде
Теги для поиска: #_razrabotka_igr (Разработка игр), #_unreal_engine, #_unrealengine, #_razrabotka_igr (разработка игр), #_razrabotka_igr (
Разработка игр
), #_unreal_engine
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 04:23
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
В стандартной сетевой архитектуре Unreal Engine, сервер проверяет, изменение значения у реплицированной переменной Actor класса, и в случае отличия, значение синхронизируется между сервером и клиентом. Когда объем данных для синхронизации не больших размеров, особых проблем с производительностью нет. Однако, игра часто может состоять из огромного множества Актеров и переменных, которые необходимо реплицировать одному или нескольким клиентам, и это уже может стать проблемным местом.UE уже предоставляет такие функции как: NetUpdateFrequency, NetCullDistanceSquared и т.д. Основная задача которых состоит в том, что бы устранить из общей картины репликации, как можно больше актеров не нуждающихся в постоянно синхронизации данных.PushModel, пока что экспериментальная фича, которая может позволить разработчикам активно отмечать необходимость синхронизации свойства, для этого предоставляется несколько макросов: #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) PublicDependencyModuleNames.AddRange(new string[] {"NetCore"});
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); } 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; }; MARK_PROPERTY_DIRTY_FROM_NAME(ASomeActor, SomeVar, this);
SomeVar = SomeValue; =========== Источник: habr.com =========== Похожие новости:
Разработка игр ), #_unreal_engine |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 23-Ноя 04:23
Часовой пояс: UTC + 5