Что лучше, надёжнее и быстрее?
Работать с группами юнитов: при их добавлениии, проверки наличия, удалении и т. д.
Может, в каких-то ситуациях лучше работать с группами, а в каких-то - с таблицами?
Или создавать структуры, и работать с ними?
Если кто-то проводил тестирование в разных ситуациях и/или находил подводные камни двух подходов - поделитесь, пожалуйста.
Интересно знать про рабготы с огромными данными, если в проекте огромное количество групп(или таблиц), в каждой может быть много юнитов, проверки на наличие юнитов в списках происходят постоянно, постоянно происходит добавление и удаление юнитов из списков.
А-ля:
units = {}
table.insert( units, unit )

function isUnitInTable(table, unit)
  for k, v in pairs(table) do
    if v == unit then return true end
  end
  return false
end

if isUnitInTable( units, unit ) then
  --это выполнится
else
  --а это не выполнится
end

Принятый ответ

сортированный список
Сортированный не есть упорядоченный. Перед тем как токсичить без причины стоит хотя бы с терминологией ознакомится.
те более если использовать пейрсы как в вашем примере, это путь к десинкам
pairs - это просто функция, которая возвращает функцию next, переданную таблицу и nil. Если у таблицы есть метаметод __pairs, то вызывается он. Таким образом, добавляется метаметод и никаких десинков нет.
отссылая в гугл
Он отослал не в гугл, а на страницу вики от юзеров луа. Но это всё же такой себе источник. И как я уже сказал, pairs вообще не при делах. Всё дело в функции next. Цитата из официальной документации Lua 5.3:
Allows a program to traverse all fields of a table. Its first argument is a table and its second argument is an index in this table. next returns the next index of the table and its associated value. When called with nil as its second argument, next returns an initial index and its associated value. When called with the last index, or with nil in an empty table, next returns nil. If the second argument is absent, then it is interpreted as nil. In particular, you can use next(t) to check whether a table is empty.
The order in which the indices are enumerated is not specified, even for numeric indices. (To traverse a table in numerical order, use a numerical for.)
The behavior of next is undefined if, during the traversal, you assign any value to a non-existent field in the table. You may however modify existing fields. In particular, you may clear existing fields.
Таким образом, порядок может быть идентичен на разных машинах, а может быть и не идентичен. Поэтому изначальное утверждение Hate правдиво:
что на одном компьютере будет A, B, C а на втором C, B, A

Что касается самого вопроса. Удобство таблиц в том, что их не надо удалять функцией, но нужно реализовать уникальность юнитов. На HIVE есть готовая библиотека, которая включает в себя переписывание нативок для групп юнитов, точек, ректов и групп игроков на таблицы. Краткое описание библиотеки от автора, Bribe:
Most recently, I've revamped the old GUI Fixer Collection to a much more powerful tool: Lua-Infused GUI. Since GUI variables don't actually require strict type assignment when compiled into Lua, I was able to change Locations, Rects, Unit Groups and Player Groups into Lua tables, allowing them to consume an order of magnitude less RAM and be automatically cleaned up by Lua's garbage collector.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
13
10 месяцев назад
0
Запусти этот код несколько раз прям из IDE
С чего ты взял, что я пользуюсь IDE для варика?
Мне, как пещерному человеку, хватает дефолтного редактора.
Загруженные файлы
0
26
10 месяцев назад
0
Запусти этот код несколько раз прям из IDE
С чего ты взял, что я пользуюсь IDE для варика?
Мне, как пещерному человеку, хватает дефолтного редактора.
на скрине у тебя ipairs, речь про pairs. не знаю, намеренно ли ты показал этот кусок, или просто рандомный заскринил
по поводу практики, ну, сходи на хайв и спроси брайба как он не понимал почему его демедж система десинкает.
я тоже в карте использую pairs, и я не говорил о том, что при 100% использовании пейрсов у тебя 100% десинков. речь шла о том, что пейрсы с логикой игры могут привести к разному результату у разных игроков что означает десинк. до тех пор, пока это не приводит к изменению логики игры, можно использовать пейрсы
0
13
10 месяцев назад
0
рандомный заскринил
рандомный, просто показал, что я не использую IDE для варика. Хотя и на этом рандомном скрине на 4-й строке с конца можешь увидеть присовение нечисловых ключей, но это случайно попало, не преднамеренно.
я тоже в карте использую pairs, и я не говорил о том, что при 100% использовании пейрсов у тебя 100% десинков. речь шла о том, что пейрсы с логикой игры могут привести к разному результату у разных игроков что означает десинк. до тех пор, пока это не приводит к изменению логики игры, можно использовать пейрсы
Вот это уже конкретнее, спасибо.
Если в каких-то определённых кейсах паирсы вызывают проблему, хотелось бы отловить эти кейсы.
Если я с таковыми встречусь - обязательно дам знать.
Также буду благодарен, если кто-то поделится конкретными кейсами использования, после которого начинают происходить проблемы.
Пока что могу сказать, что у меня все данные в карте хранятся через вложенные таблицы, часть из которых используют в качестве ключей самые разные данные - от строк до юнитов и таблиц.
Пересчёты происходят регулярно и в больших объёмах.
Первые тесты показывают, что проблем с десинками нет.
Но не исключено, что это может быть плавающей багой. Так как опыт подсказывает, что некоторые кейсы могут начать всплывать в определённых ситуациях (например - если используются разные версии локализации)
0
26
10 месяцев назад
0
ну правило одно, уже писал. пейрсы и логика игры завязанная на этом вылетет в отстрел филейной части.
если ты решаешь что делать с юнитами например, кого то похилить, или подвинуть. это все меняет логику игры
0
13
10 месяцев назад
0
ну правило одно, уже писал. пейрсы и логика игры завязанная на этом вылетет в отстрел филейной части.
если ты решаешь что делать с юнитами например, кого то похилить, или подвинуть. это все меняет логику игры
у меня они постоянно участвуют в изменении логики: над юнитами из списка происходит воздействие, связенное с перемещением по карте
0
13
10 месяцев назад
Отредактирован Cancel
0
если ты решаешь что делать с юнитами например, кого то похилить, или подвинуть. это все меняет логику игры
Вот лишь один из примеров: функция проходит по юнитам отряда и возрождает их, если они нуждаются в возрождении
Такие штуки используются часто и запускаются постоянно. Недавние наигрывания к ошибке синхронизации не привели.
Но - буду тестировать ещё.
Загруженные файлы
0
29
10 месяцев назад
Отредактирован nazarpunk
0
Cancel, у тебя ключи именованные или ты с массивом работаешь?
0
13
10 месяцев назад
0
у тебя ключи именованные или ты с массивом работаешь?
в качестве ключей в разных ситуациях используются юниты, другие таблицы, игроки и прочее. Так, например по юниту находится таблица с его расширенными свойствами в общем каталоге, а по игроку находится его армия.
Иногда я совершаю групповые действия, перебирая значения таких таблиц.

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

Сейчас пересматриваю код, и думаю, что возможно вы и правы, я так не нахожу где логика может поломаться, что значени явызовутся в разной последовательности, так что мои сегодняшние проверки могут оказаться не валидными.
Если это так, то приношу извинения перед Hate за то, что преждевременно вспылил.
Как соберу людей для тестирования, перепроверю другие алгоритмы.
0
28
10 месяцев назад
0
сортированный список
Сортированный не есть упорядоченный. Перед тем как токсичить без причины стоит хотя бы с терминологией ознакомится.
те более если использовать пейрсы как в вашем примере, это путь к десинкам
pairs - это просто функция, которая возвращает функцию next, переданную таблицу и nil. Если у таблицы есть метаметод __pairs, то вызывается он. Таким образом, добавляется метаметод и никаких десинков нет.
отссылая в гугл
Он отослал не в гугл, а на страницу вики от юзеров луа. Но это всё же такой себе источник. И как я уже сказал, pairs вообще не при делах. Всё дело в функции next. Цитата из официальной документации Lua 5.3:
Allows a program to traverse all fields of a table. Its first argument is a table and its second argument is an index in this table. next returns the next index of the table and its associated value. When called with nil as its second argument, next returns an initial index and its associated value. When called with the last index, or with nil in an empty table, next returns nil. If the second argument is absent, then it is interpreted as nil. In particular, you can use next(t) to check whether a table is empty.
The order in which the indices are enumerated is not specified, even for numeric indices. (To traverse a table in numerical order, use a numerical for.)
The behavior of next is undefined if, during the traversal, you assign any value to a non-existent field in the table. You may however modify existing fields. In particular, you may clear existing fields.
Таким образом, порядок может быть идентичен на разных машинах, а может быть и не идентичен. Поэтому изначальное утверждение Hate правдиво:
что на одном компьютере будет A, B, C а на втором C, B, A

Что касается самого вопроса. Удобство таблиц в том, что их не надо удалять функцией, но нужно реализовать уникальность юнитов. На HIVE есть готовая библиотека, которая включает в себя переписывание нативок для групп юнитов, точек, ректов и групп игроков на таблицы. Краткое описание библиотеки от автора, Bribe:
Most recently, I've revamped the old GUI Fixer Collection to a much more powerful tool: Lua-Infused GUI. Since GUI variables don't actually require strict type assignment when compiled into Lua, I was able to change Locations, Rects, Unit Groups and Player Groups into Lua tables, allowing them to consume an order of magnitude less RAM and be automatically cleaned up by Lua's garbage collector.
Принятый ответ
0
13
10 месяцев назад
Отредактирован Cancel
0
PT153, спасибо за развёрнутый ответ!
Но я, если честно, не понял, как из приведённой выдержки документации ты сделал вывод о том, что порядок может быть не идентичным на разных машинах? Где намёк на то, что next ведёт себя непредсказуемо? Увидел лишь намёк на то, что не стоит добавлять ключи во время прогонки, так как поведение при этом не будет предопределено. Возможно, здесь проблема в языковом барьере, так как я пропускаю такие тексты через переводчик, но из выдержки я такой информации не нашёл. Но, опять же, это не значит, что это не правда, просто уточняю.
или "порядок перечисления индексов не указан" == "порядок непредсказуем"?
Хотя на самом деле, если кто-то проводил реальные полевые тесты, то этого достаточно. Также достаточно и того, что три профессионала выразили общую точку зрения.
Поэтому - всем спасибо за разъяснения.
Загруженные файлы
0
29
10 месяцев назад
0
как из приведённой выдержки документации ты сделал вывод о том, что порядок может быть не идентичным на разных машинах?
Он может быть разным тупо на одной машине. Или ты мой коммент проигнорил?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.