DakiLLa Posted April 3, 2012 Share Posted April 3, 2012 Предположим, имеется массив, который хранит в себе элементы игроков, порядка 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
_Dark_ Posted April 4, 2012 Share Posted April 4, 2012 local players = getElementsByType( "player") for _, player in ipairs(players) do --Действия для игроков, элемент игрока соответственно - player end По другому не знаю как. И вообще, на Вики написано, что если элемент в triggerClientEvent не важен, используйте root. https://wiki.multitheftauto.com/wiki/TriggerClientEvent И еще: чем вам не нравится вызывать клиентскую функцию в цикле? Просто отправится запрос игрокам, не одному игроку, а каждому, по очереди. В чем дело то? Link to comment
Arisu Posted April 4, 2012 Share Posted April 4, 2012 Правильно. Эвент в любом случае уйдет одинаковым количеством сетевых данных (каждому игроку - по пакету), ну а цикл из 60 итераций это не так уж и дорого по времени исполнения. Link to comment
DakiLLa Posted April 4, 2012 Author Share Posted April 4, 2012 ну а цикл из 60 итераций это не так уж и дорого по времени исполнения. Ну, вообще имелось ввиду 60 итераций triggerClientEvent, не загнется ли от этого канал? Равносильно ли это вызову одного triggerClientEvent на rootElement, если учитывать, что массив players - это все игроки сервера ? Link to comment
Arisu Posted April 5, 2012 Share Posted April 5, 2012 ну а цикл из 60 итераций это не так уж и дорого по времени исполнения. Ну, вообще имелось ввиду 60 итераций triggerClientEvent, не загнется ли от этого канал? Равносильно ли это вызову одного triggerClientEvent на rootElement, если учитывать, что массив players - это все игроки сервера ? Скорей всего, это будет равносильно. При подаче rootElement (или другого элемента) в вызов функции, логика выбирает все подходящие по типу элементы в дереве (игроки, например), к которым функция применима. Формирует из них списочек и для каждого элемента из списка выполняет функцию. А пакет в любом случае придется доставлять каждому игроку лично, так что разницы и тут не будет, отдашь ты rootElement функции и мта внутренне разберет рута по игрокам, или отдашь каждого в отдельности. Ну а хватит ли пропускной способности тебе, чтобы сразуивсем передать, зависить только от твоей пропускной способности. Если что-то соврал, только не кидайтесь в меня Kenix'ом, пожалуйста Link to comment
Other Languages Moderators Disinterpreter Posted April 5, 2012 Other Languages Moderators Share Posted April 5, 2012 Если что-то соврал, только не кидайтесь в меня Kenix'ом, пожалуйста Только что хотел посадить Kenix'a в катапульту. Link to comment
_Dark_ Posted April 5, 2012 Share Posted April 5, 2012 ну а цикл из 60 итераций это не так уж и дорого по времени исполнения. Ну, вообще имелось ввиду 60 итераций triggerClientEvent, не загнется ли от этого канал? Равносильно ли это вызову одного triggerClientEvent на rootElement, если учитывать, что массив players - это все игроки сервера ? Простите, вы считаете, что канал пропускной способностью 100 Mb/s (или 1 Mb/s, не важно), "загнется" от того, что будет послано несколько сотен килобайт данных? Link to comment
lil Toady Posted April 7, 2012 Share Posted April 7, 2012 Как раз triggerClientEvent, где получатель - root element, это немного лучше чем цикл, в данном случае функция все равно ищет в древе лишь игроков. На трафик это никак не повлияет, выйдет одинаковое кол-во информации, но через цикл мта создаст по пакету на каждый запрос, то есть 60 одинаковых пакетов, а если для root element вызывать то всего один пакет, который мта разошлет каждому игроку. А вот когда root element - это source в trigger(Client/Server)Event, это уже хуже. МТА пойдет по всему древу искать обработчики для этого события. Link to comment
DakiLLa Posted April 7, 2012 Author Share Posted April 7, 2012 А вот когда root element - это source в trigger(Client/Server)Event, это уже хуже. МТА пойдет по всему древу искать обработчики для этого события. Ага, вот как.. Буду исправлять это дело. Спасибо за ответы. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now