Jump to content

Дерево элементов


Recommended Posts

Предположим, имеется массив, который хранит в себе элементы игроков, порядка 60-70.

local players = {} --[1] = player1, [2] = player2, ... 

Необходимо вызвать клиентское событие для каждого игрока из этого массива. Логично предположить, что

for _, tPlayer in ipairs( players ) do 
  triggerClientEvent( tPlayer, "myClientEvent", root ) 
end 

такой прием не лезет ни в какие ворота. Какие еще остаются варианты?

Если создать элемент (createElement) и сделать его родителем каждого игрока с помощью setElementParent, то это заставляет игру притормозить буквально на полсекунды.

local tempElem = createElement( "tempElem" ) 
for _, tPlayer in ipairs( players ) do 
  setElementParent( tPlayer, tempElem ) 
end 

В общем что-то происходит не так.

В конечном итоге хотелось бы прийти к варианту

triggerClientEvent( tempElem, "myClientEvent", root ) 

т.е. tempElem являлся бы родителем всех игроков из массива players. Зачем? На вики написано, что необходимо всеми способами избегать использования rootElement при вызове клиентских/серверных событий в угоду оптимизации.

Как быть?

Link to comment
local players = getElementsByType( "player") 
for _, player in ipairs(players) do 
--Действия для игроков, элемент игрока соответственно - player 
end 

По другому не знаю как.

И вообще, на Вики написано, что если элемент в triggerClientEvent не важен, используйте root.

https://wiki.multitheftauto.com/wiki/TriggerClientEvent

И еще: чем вам не нравится вызывать клиентскую функцию в цикле? Просто отправится запрос игрокам, не одному игроку, а каждому, по очереди. В чем дело то?

Link to comment

Правильно. Эвент в любом случае уйдет одинаковым количеством сетевых данных (каждому игроку - по пакету), ну а цикл из 60 итераций это не так уж и дорого по времени исполнения.

Link to comment
ну а цикл из 60 итераций это не так уж и дорого по времени исполнения.

Ну, вообще имелось ввиду 60 итераций triggerClientEvent, не загнется ли от этого канал? Равносильно ли это вызову одного triggerClientEvent на rootElement, если учитывать, что массив players - это все игроки сервера ?

Link to comment
ну а цикл из 60 итераций это не так уж и дорого по времени исполнения.

Ну, вообще имелось ввиду 60 итераций triggerClientEvent, не загнется ли от этого канал? Равносильно ли это вызову одного triggerClientEvent на rootElement, если учитывать, что массив players - это все игроки сервера ?

Скорей всего, это будет равносильно. При подаче rootElement (или другого элемента) в вызов функции, логика выбирает все подходящие по типу элементы в дереве (игроки, например), к которым функция применима. Формирует из них списочек и для каждого элемента из списка выполняет функцию.

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

Ну а хватит ли пропускной способности тебе, чтобы сразуивсем передать, зависить только от твоей пропускной способности.

Если что-то соврал, только не кидайтесь в меня Kenix'ом, пожалуйста

Link to comment
ну а цикл из 60 итераций это не так уж и дорого по времени исполнения.

Ну, вообще имелось ввиду 60 итераций triggerClientEvent, не загнется ли от этого канал? Равносильно ли это вызову одного triggerClientEvent на rootElement, если учитывать, что массив players - это все игроки сервера ?

Простите, вы считаете, что канал пропускной способностью 100 Mb/s (или 1 Mb/s, не важно), "загнется" от того, что будет послано несколько сотен килобайт данных?

Link to comment

Как раз triggerClientEvent, где получатель - root element, это немного лучше чем цикл, в данном случае функция все равно ищет в древе лишь игроков. На трафик это никак не повлияет, выйдет одинаковое кол-во информации, но через цикл мта создаст по пакету на каждый запрос, то есть 60 одинаковых пакетов, а если для root element вызывать то всего один пакет, который мта разошлет каждому игроку. А вот когда root element - это source в trigger(Client/Server)Event, это уже хуже. МТА пойдет по всему древу искать обработчики для этого события.

Link to comment
А вот когда root element - это source в trigger(Client/Server)Event, это уже хуже. МТА пойдет по всему древу искать обработчики для этого события.

Ага, вот как.. Буду исправлять это дело.

Спасибо за ответы.

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...