Портал игровых серверов GMNET.RU - ArmA2.RU
spacerspacer Главная spacerspacer Форум spacerspacer Игровые Сервера spacerspacer Правила Игровых Серверов spacerspacer
Старый 13.10.2013, 17:32   #1
Prodavec
Подполковник
 
Аватар для Prodavec
 
Регистрация: 23.07.2009
Сообщений: 2,358
Сказал cпасибо: 268
Поблагодарили 915 раз в 549 сообщениях
Неоптимизированная передача массивов через publicVariable

[Только зарегистрированные и активированные пользователи могут видеть ссылки. ]. Просьба проголосовать, поможет в уменьшении сетевого траффика.

В общем понимаю что писать о таких вещах надо на баг-трекер, но судя по тому какие тикеты там закрывают и с какой скоростью кажется, что он неэффективен. Возможно если не заломает, создам тикет и через год, а может через два дело поправят.

Проблема такая, еще с A2 (как минимум).

Код:
someVariable = "Some shitty value";

for "_i" from 0 to 999 step 1 do
{
    publicVariable "someVariable";
};
Казалось, зачем такой аццкий спам? Объясняю. Я сравниваю относительные затраты траффика. Возьмем например передачу строки и видим через #monitor 1 картинку

Цитата:
Server load: FPS 50, memory 287 MB, out: 15 Kbps in: 340 Kbps
Теперь сделаем тоже самое, только сменим тип на массив:

Код:
someVariable = ["Some shitty value"]
Цитата:
Server load: FPS 50, memory 287 MB, out: 10 Kbps in: 1730 Kbps
Что это блеать такое? Или вот, вложенные массивы с пустым содержимым

Код:
someVariable = [[], []]
Цитата:
Server load: FPS 50, memory 287 MB, out: 12 Kbps in: 2012 Kbps
Код:
someVariable = objNull
Цитата:
Server load: FPS 50, memory 287 MB, out: 9 Kbps in: 288 Kbps
Код:
someVariable = "Tut bleat simvolov ne malo i bolshe chem vnizu!"
Цитата:
Server load: FPS 50, memory 287 MB, out: 17 Kbps in: 582 Kbps
Код:
someVariable = [objNull, objNull, objNull, objNull]
Цитата:
Server load: FPS 50, memory 287 MB, out: 24 Kbps in: 3089 Kbps
Джопа:

Код:
someVariable = [1, ["aaa", "bbb"], 2, []]
Цитата:
Server load: FPS 50, memory 287 MB, out: 30 Kbps in: 3711 Kbps
Server load: FPS 50, memory 287 MB, out: 26 Kbps in: 948 Kbps
ну и есть массив из двух сотен элементов, сложный и навороченный, аля master array из life-миссий:

Цитата:
Server load: FPS 50, memory 287 MB, out: 30 Kbps in: 7911 Kbps
Server load: FPS 50, memory 287 MB, out: 26 Kbps in: 15674 Kbps
Server load: FPS 50, memory 287 MB, out: 16 Kbps in: 15830 Kbps
Server load: FPS 50, memory 287 MB, out: 24 Kbps in: 15319 Kbps
...
и так 40 раз!!!
...
Server load: FPS 50, memory 287 MB, out: 13 Kbps in: 515 Kbps
Для сравнения, тот же массив но str thatArray; то есть в виде строки:

Цитата:
Server load: FPS 50, memory 287 MB, out: 30 Kbps in: 12389 Kbps
Server load: FPS 50, memory 287 MB, out: 26 Kbps in: 5871 Kbps
Во время передачи где 40 строк написало, невозможно было сделать #missions, всё блокировалось потоком спама. Спросите от куда такой траффик может быть на практике? Да при передаче аргументов для вызова удаленных функций, например через BIS_fnc_MP или ее аналогов для выполнения регулярных действий - перекладки предметов и т.п. Если игроков много, это ой как актуально становится. Естессно для ситуаций "Мы с ваней запилили на двоих сервак и карту в редакторе накидали" я не рассматриваю, только для больших проектов, типа той же Warfare.

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

1. На преобразования нужны ресурсы, а их в арме никогда много не было.
2. Как передавать объекты, имена которым не заданы? Например

[player, 1, 2, 3, "bla-bla-bla"]; после действия str превратится в что-то подобное этому:
"C Alpha 2-3:1 (Hui)", что неприемлемо. А такие объекты, у которых нет имен, но есть указатель на них могут быть. Их придется как-то тоже преобразовывать.

3. Передача чисел, модуль которых больше 999 999 или меньше 0.0001, мы получим их представление в виде строки: 1e+006 или 9e-005 (мантисса и экспонента) со всеми вытекающими из этого представления.

В общем какие есть идеи как изобрести костыль? Или кроме как BIS это дерьмо никто не починит)

Prodavec добавил через 298 Мин. и 35 Сек.

[Только зарегистрированные и активированные пользователи могут видеть ссылки. ]. Просьба проголосовать, поможет в уменьшении сетевого траффика.

Последний раз редактировалось Prodavec; 13.10.2013 в 17:33. Причина: Двойной ответ
Prodavec вне форума   Ответить с цитированием
Старый 13.10.2013, 20:12   #2
kordax
Mладший Лейтенант
 
Аватар для kordax
 
Регистрация: 28.10.2011
Адрес: Русь Православная
Сообщений: 860
Сказал cпасибо: 330
Поблагодарили 473 раз в 365 сообщениях
А какой костыль ты имеешь ввиду, если дело сто пудов в самом классе массива.
Я имею ввиду, что тут нужно создавать свой собственный тип массив, который нужно будет вдобавок интегрировать в сетевой код, со всеми членами класса.

Соответственно это ошибка бисов, просто моё скромное мнение.
kordax вне форума   Ответить с цитированием
Старый 20.10.2013, 01:45   #3
Bomba1
Подполковник
 
Регистрация: 01.11.2010
Сообщений: 2,042
Сказал cпасибо: 207
Поблагодарили 988 раз в 575 сообщениях
Цитата:
Сообщение от Prodavec Посмотреть сообщение
2. Как передавать объекты, имена которым не заданы? Например
[player, 1, 2, 3, "bla-bla-bla"]; после действия str превратится в что-то подобное этому:
ну вроде все очевидно...

а) не передавать сам объект, а указатель на него, типа "oid:123123" - oid пихнуть в имя или в контейнер переменных объекта
все создаваемые объекты индексировать на сервере и бродкастить
b) сериализовать такие числа самомстоятельно (проверить лимиты перед кастомной сериализацией)
или поднять до целого (сколько знаков надо)

с) припилить ext-модуль и общаться с сервером через него (тут полет фантазии велик хоть java хоть .net, хоть c++),
но не каждого клиента заставишь такой модулек поставить в систему (хотя на туше и иже прокатило - модуль рации для интеграции с TS)

PS. BIS мудоки что все никак джаву нормально не впилят, все тянут свой этот цыплячий язык (sqf)...

PPS. а что там столько трафика генерит? они там шифруют и передают пакеты исключительно по 1-2Мб
Bomba1 вне форума   Ответить с цитированием
Старый 20.10.2013, 03:22   #4
Prodavec
Подполковник
 
Аватар для Prodavec
 
Регистрация: 23.07.2009
Сообщений: 2,358
Сказал cпасибо: 268
Поблагодарили 915 раз в 549 сообщениях
a) Как получить идентификатор объекта, какой командой (и чтобы на клиенте работало)?

Для managed-объектов, например создаваемых вручную техники, машин, ящиков и т.п. не проблема добавлять в массив вида [oid, object] с кешированным oid для быстрого поиска через find. Однако для unmanaged-объектов типа GroundWeaponHolder, мусора, всякого хлама на карте и т.п. придется пробегаться по всем объектам например через {...} forEach (allMissionObjects "All"); и проверять внесен ли объект в список или нет. Если нет, то внести. А это всё ресурсы.... Может так получится что по сети придет ссылка на объект, которого еще нет в массиве) Тада надо ситуацию обработать, дождаться завершения операции или принудительно форсировать поиск объекта по oid'у.

b) Наверное тут и нет вариантов других) преобразовывать числа в удобоваримый формат 999 999 999. Снова ресурсы...

c) Да все так. Не все поставят, а те кто поставят могут столкнуться с антивирусом/правами/силами электричества/принципиальным нежеланием ставить без открытых исходников. Хотя такое решение позволит полностью реализовать свою передачу, думаю значительно более экономичную и не влияющую на блокировку #missions, #kick и т.п. при передачи больших объемов.

В общем тикет создан, если к релизу второй части синглплеера не поправят, придется делать сраный костыль.

С пунктом a) всё упрощается, сейчас покопался и вот что нашел:
[Только зарегистрированные и активированные пользователи могут видеть ссылки. ]
Цитата:
Unique ID of object or group.
[Только зарегистрированные и активированные пользователи могут видеть ссылки. ]
Цитата:
Get object with given unique ID.
То что надо! Вероятно тогда даже не нужно никаких массивов создавать, только передавать ID объекта.

Код:
objectFromNetId (netId player);
возвращает player, вроде работает)

netId строка, так что [player, Victim1, Victim2, Car1] становится с делимитером ";"

"2:39;2:15;2:18;2:145"

что уже лучше)

Последний раз редактировалось Prodavec; 20.10.2013 в 03:26.
Prodavec вне форума   Ответить с цитированием
Старый 20.10.2013, 13:34   #5
Bomba1
Подполковник
 
Регистрация: 01.11.2010
Сообщений: 2,042
Сказал cпасибо: 207
Поблагодарили 988 раз в 575 сообщениях
netId появился в третьей арме, наверно благодаря дейзу
во второй небыло и наверно не появиться
но! прогресс...

но и без нее
{...} forEach (allMissionObjects "All"); - необязательно,

серверный скрипт сам может расставить сразу же,
а клиентский если oid отсутствует - вставляем в массив как есть объектом, а сервер пусть его регает

плохо если это на всех пытается бродкаститься с клиента, тут предватиельно надо сервер дернуть чтоб проставил таки идентификатор
Bomba1 вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 16:54. Часовой пояс GMT +3.

Powered by vBulletin®
Copyright ©2000 - 2018, vBulletin Solutions, Inc.

GMNET.RU © 2003-2018 || Дизайн студии vR