Jump to content

Нагрузка triggerClient/ServerEvent


Recommended Posts

Давно уже ничего для МТА не кодил, но вдруг стало интересно, насколько оправданной была одна из моих старых затей. Интересует собственно то, что в названии темы, но я всё же задам вопрос поконкретней после небольшой предыстории:

Когда я баловался с МТА, меня в первую очередь интересовала возможность добавления новых элементов геймплея и как-то раз я написал несложную систему "каштомных" снарядов, вместо заводских projectiles. (банально на клиенте создавался объект, который плавно перемещался, просчитывая коллизии каждые 100 мс как материальная точка, на которую действует гравитация). Получается создал одновременно на всех клиентах "снаряд" в одинаковой позиции, с одинаковым начальным вектором движения, ну и вообще поведением, получил вполне себе реальный предмет, который все видят.

Потом и несложный алгоритм синхронизации прикрутил - в зависимости от пинга игрока добавлять искусственные задержки или наоборот просчитывать снаряд наперёд. Вообщем получилось довольно весело, поиграли несколько вечеров с парой друзей, покидались всякими осколочными гранатами и баскетбольными мячами на моём сервере, пинги 50-150, всё смотрится естественно и синхронизировано, никто не жалуется на задержки, но нагрузка-то никакая, нас всего трое.

Вопрос в том, насколько это оптимизировано в сетевом контексте, вот пожалуй ещё конкретней:

клиент вызывает triggerServerEvent("onPlayerThrowSuperBanana",localPlayer,x,y,z,rotXY,rotZ,force); - позиция игрока, два угла, чтобы обозначить направление и сила броска. (думаю можно опустить x,y,z и спрашивать позицию у сервера)

сервер получает информацию, пересылает её всем игрокам в нужном радиусе и на этом сетевая часть заканчивается.

Насколько это затратней, чем просто синхронизировать, как игрок метает обычную гранату из gta sa? Что если целый дм-мод построить на том, как 30 игроков будут "кидаться" чем-либо каждую секунду?

Я понимаю, что обычная синхронизация в МТА это алгоритм посложнее, чем на все кнопки по tcp пакетику отправлять, но всё-таки такое событие как бросок гранаты вряд ли дожидается каких-то очередей и возможно схоже с тем, что я делал при помощи triggerServerEvent? в сетевых технологиях не особенно разбираюсь.

Link to comment
  • Other Languages Moderators
Давно уже ничего для МТА не кодил, но вдруг стало интересно, насколько оправданной была одна из моих старых затей. Интересует собственно то, что в названии темы, но я всё же задам вопрос поконкретней после небольшой предыстории:

Когда я баловался с МТА, меня в первую очередь интересовала возможность добавления новых элементов геймплея и как-то раз я написал несложную систему "каштомных" снарядов, вместо заводских projectiles. (банально на клиенте создавался объект, который плавно перемещался, просчитывая коллизии каждые 100 мс как материальная точка, на которую действует гравитация). Получается создал одновременно на всех клиентах "снаряд" в одинаковой позиции, с одинаковым начальным вектором движения, ну и вообще поведением, получил вполне себе реальный предмет, который все видят.

Потом и несложный алгоритм синхронизации прикрутил - в зависимости от пинга игрока добавлять искусственные задержки или наоборот просчитывать снаряд наперёд. Вообщем получилось довольно весело, поиграли несколько вечеров с парой друзей, покидались всякими осколочными гранатами и баскетбольными мячами на моём сервере, пинги 50-150, всё смотрится естественно и синхронизировано, никто не жалуется на задержки, но нагрузка-то никакая, нас всего трое.

Вопрос в том, насколько это оптимизировано в сетевом контексте, вот пожалуй ещё конкретней:

клиент вызывает triggerServerEvent("onPlayerThrowSuperBanana",localPlayer,x,y,z,rotXY,rotZ,force); - позиция игрока, два угла, чтобы обозначить направление и сила броска. (думаю можно опустить x,y,z и спрашивать позицию у сервера)

сервер получает информацию, пересылает её всем игрокам в нужном радиусе и на этом сетевая часть заканчивается.

Насколько это затратней, чем просто синхронизировать, как игрок метает обычную гранату из gta sa? Что если целый дм-мод построить на том, как 30 игроков будут "кидаться" чем-либо каждую секунду?

Я понимаю, что обычная синхронизация в МТА это алгоритм посложнее, чем на все кнопки по tcp пакетику отправлять, но всё-таки такое событие как бросок гранаты вряд ли дожидается каких-то очередей и возможно схоже с тем, что я делал при помощи triggerServerEvent? в сетевых технологиях не особенно разбираюсь.

Лично я ничего по этому поводу не знаю. Но подсказать могу.

Надеюсь тут ты найдешь полезную тебе информацию:

https://wiki.multitheftauto.com/wiki/Re ... ncebrowser

https://wiki.multitheftauto.com/wiki/GetNetworkStats

https://wiki.multitheftauto.com/wiki/Ge ... kUsageData

Link to comment

Мое мнение вот такое. Как только ты начинаешь кидать гранату, получай всех игроков в стриме и отправляй их на сервер. После этого на сервере отправляй 1 пакет всем игрокам, которых ты получил у себя в стриме. Вроде бы совсем недавно была добавлена возможность отправлять пакет конкретным игрокам, а не всем. Лучше этого варианта я думаю что не найдешь.

Клиент

  
-- Собираем всех игроков в стриме 
local aStreamedInPlayers = getElementsByType( "player", root, true ); 
triggerServerEvent("onPlayerThrowSuperBanana",localPlayer, aStreamedInPlayers, x,y,z,rotXY,rotZ,force); 
  

Сервер

  
addEvent( "onPlayerThrowSuperBanana", true ); 
  
addEventHandler( "onPlayerThrowSuperBanana", root, 
 function( aStreamedInPlayers, ... ) 
  triggerClientEvent( aStreamedInPlayers, "onClientPlayerThrowSuperBanana", source, ... ); 
 end 
); 
  

Link to comment

а какой в этом смысл-то вообще? Можно на сервере взять всех игроков в радиусе (где-нить 50-100 клеток) и разослать, (как я и делал), какой смысл грузить канал и отправлять серверу длиннющий массив из нужных игроков, вся информация в котором серверу итак известна? возможность отправлять пакет конкретным игрокам всегда существовала, а фразу "отправляй ОДИН пакет ВСЕМ игрокам" я не понимаю ни в каком контексте).

По поводу ссылочек от Disinterpreter:жаль, что этот перфоманс браузер видимо не выдаёт никакой информации по поводу нагрузки на канал, только цпу... но вот с двумя следующими функциями наверное можно что-то получить - как минимум попытаться измерить количество и размер пакетов, которые МТА использует для дефолтной синхронизации гранат, может когда-нибудь займусь, если интерес появится

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...