Возможно ли в "базовой комплектации" организовать обмен сообщениями или использовать какую-либо глобальную переменную, которая будет доступна в любом инстансе скриптов ?
В чем смысл: есть игра, которая запускает lua и мне нужно наладить сообщения между этими клиентами. Общение через файловую систему выглядит крайне дорого для перформанса и в целом не слишком быстрой. Поэтому у меня вопрос, есть ли в lua что-то типа shared buffer без дополнительных пакетов или хотя бы вебсокет ? Или, возможно, есть еще какие-либо решения.
Для самого примитивного обмена используется luasocket. Низкоуровневая библиотека для работы с сокетами.
Если есть возможность иметь запускать инстансы вручную, то можно посмотреть lua-lanes. Это библиотека для меж-инстансового общения, каждый инстанс запускается в отдельном потоке, а общение идёт через очередь.
Если в проекте уже есть shared memory, и пользуйтесь LuaJIT, можно посредством FFI работать с общими данными.
Если играл в Ragnarok, то я про систему гомункулов. Если не играл, то суть примерно такая: после призыва условного питомца, им можно управлять через кастомные скрипты, с основным файлом AI.lua в папке, минимальное содержание которого для работы это
function AI (myid)
end
тоесть клиент сам вызывает эту функцию когда ему нужно, например при перемещении или других событиях, примерно каждые 100мс. В этой функции можно получать информацию об окружающем пространстве, по типу координат, типов монстров, их ИД и тд.
Дак вот, если будет запущено 50 клиентов, то соответственно как-то сильно много получается вызовов и обработок, я хочу, чтобы в они использовали информацию только из 1 источника, а не каждый свою. Вот я и не знаю как их можно подружить друг с другом, чтоб они знали о соседях. Первая мысль была через файловую систему, типа если в этой папке файла, допустим "state.json" нет, то 1 из клиентов его создает и становится что-то вроде хоста, если файл уже есть, то значит другие не собирают инфу из игры, а берут ее из файла. Вот я бы хотел узнать, возможно ли сделать менее накладную систему не через файлы.
Не знаю насколько это возможно, в плане подключения сторонних библиотек, поэтому спрашивал именно про что-то "встроенное" и универсальное, вот по типу воркеров или общего куска памяти где-то, еще думал насчет системных переменных os.getenv("VAR") и os.execute для назначения, но выглядит сильно ограничено.
Алексей, Странно, что логика находится у клиента. Может, всё проще? Может через глобальные переменные они смогут увидеть друг друга? Можно прислать документацию, возможно, там будет понятнее. Либо найти тематический форум этой игры
Савва, На форумах игры ничего нет. Возможно я как-то не правильно понимаю флоу выполнения, но выглядит какбудто каждый клиент запускает свою среду исполнения (по типу nodejs), соответственно какого-то общего пространства не замечено. Это ж ведь тоже самое что запустить просто 2 разных скрипта, разве нет ?
Test = nil
function AI(myid)
print(Test)
Test = myid
end
Если игра использует то же глобальное пространство, то переменная Test сначала будет nil, а при создании второго объекта выведет в консоль ID предыдущего объекта.
Надеюсь, там есть консоль или место, куда выводить текст :-)
Савва, В этом то и заключается вопрос, что они глобальные переменные не шарят между собой, инчае было бы проще простого, да и если бы работало вот так, как представлено, то любой другой клиент перезаписывал бы своего гомункула на другого
Савва, _G это ведь просто ссылка на глобал область видимости.
Здесь тоже самое что ты запускаешь разные скрипты, можно сказать какбудто ты разных компьютеров запускаешь.
$> lua.exe script_1.lua
$> lua.exe script_2.lua
Даже если ты модуль какой-то подключишь или еще что-то, оно в любом случае будет изолировано в своей области видимости. Допустим я вот запустил клиент рагнарока и еще просто какойнибудь луа скрипт из консоли, у них же не будет общих ресурсов, вобщем то как и в любом другом языке. Проблема в том, что здесь луа, на любом другом уже бы давно получилось решить подобное, а здесь я даже инфу найти не могу в гугле как это можно реализовать.
Алексей, _G по умолчанию является глобальным пространством, но это можно изменить. Я предположил, что запущенная игра всего одна, и в ней создаются изолированно объекты. Так реализовано в некоторых других играх. Увы, не могу понять что из себя представляет клиент, как работает игра и как работает создание объекта.
Файл один из простых вариантов, но он не потокобезопасный. Если в файл напишут только один раз, то ок. но таким же образом можно и таблицу в Lua написать для всех объектов на чтение