2009-09-05 4 views
6

Люди, есть способ клонировать состояние Lua?Состояние клонирования Lua

В моем игровом приложении процедура инициализации виртуальной машины Lua довольно тяжелая (около 1 секунды, так как сразу загружаются многие скрипты). У меня есть отдельный Lua VM для каждого автономного агента, и как только агент создан, его инициализация Lua очень сильно влияет на FPS.

Я подумываю о следующей схеме: как насчет сохранения «предвоенного» состояния Lua, которое затем просто клонируется для каждого агента? Является ли это возможным?

+2

Многие люди пишут Lua неправильно, это не аббревиатура. Не могли бы вы изменить это выше, чтобы оно соответствовало стандартным именованиям. Мы тоже не пишем ПИТОН. Луа просто бывает трехбуквенным именем. См .: http://www.lua.org/about.html – akauppi

+3

О, извините за это. Спасибо за голову. – pachanga

+0

Вы когда-нибудь находили способ сделать это? – DShook

ответ

4

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

Если вы не можете изменить архитектуру, вы можете попробовать LuaJIT. Это может сделать инициализацию достаточно быстро для ваших целей.

Других вариантов:

  1. Rings: «Кольца это библиотека, которая предоставляет возможность для создания новых Lua утверждает внутри Lua Она также предлагает простой способ общения между создателем (мастер) и. созданных (подчиненных) состояний ".

  2. Pluto: «Плутон - это библиотека, которая позволяет пользователям записывать произвольно большие части« Вселенной Lua »в плоский файл, а затем читать их обратно в одну и ту же или другую вселенную Lua».

+0

Я думал об использовании сопрограммы, но я боюсь, что фатальная ошибка в одной сопрограмме повлияет на других, поэтому это не опция atm. Спасибо за ссылки! Я сейчас смотрю LuaJIT и Rings. Кольца, похоже, являются возможным решением моей проблемы. – pachanga

+3

Неустранимая ошибка в одной сопрограмме никак не повлияет на других. Пока мы говорим о коде Lua - пользовательский материал может нанести любой ущерб, который он запрограммирован, конечно. –

+0

Мне действительно нужно клонировать состояние. Это для POS-структуры, которую я делаю, и я не хочу, чтобы тот, кто писал сценарий, мог красть пароли кредитных карт. Библиотека EMV позволяет пользователю настраивать экраны с помощью обратных вызовов, и каждый обратный вызов запускает lua coroutine, который загружает экраны. Но coroutines обмениваются переменными, и я хочу, чтобы все изменения в среде переменных во время откат пароля возобновились ... Должен ли я создать новый вопрос для этого? –

1

Там также Lanes (download, docs) и в comparison все аналогичные продукты, которые я знаю.

О Rings сравнение лист говорит:

Кольца предлагает отдельные Lua состояния, но нет многопоточности. Это делает его простым, но он не будет использовать более одного ядра .

Примечание: В листе сравнения указано, что полосы будут только маршалировать «нециклические таблицы». Он выполняет циклы и выполняет функции маршалла, повышающие значения и т. Д. И копии копий между состояниями Lua являются прямыми копиями, не требуя для выравнивания содержимого в середине. Это делает его быстрым.

1

Если вы работаете в Linux, вы можете попробовать lper, LPSM - экспериментальную библиотеку на основе одного из авторов Lua.

+0

Да, я на Linux, спасибо за ссылку! – pachanga

1

Обратите внимание, работает с Lua 5.2 и выше

Вы можете просто ограничить доступ к этой виртуальной машине. Создайте один экземпляр со всеми необходимыми функциями, которые не будут зависеть от _G (глобального состояния Lua), а затем создают отдельную таблицу для каждого клиента. Что они будут использовать в качестве своего глобального пространства имен. Установка таблицы как текущего _G возможна через _ENV. Это довольно сложная тема для объяснения в одном посте. Короче говоря, вы готовите «виртуальный» _G для своего нового клиента, а затем просто заменяете _G на код клиента. There is where I advice you to start.

Вот в чем смысл.

local _ENV = t -- change the environment. without the local, this would change the environment for the entire chunk

Просто удалите local и вы измените _ENV для всего дальнейшего кода. Удачи в экспериментах!

P. S. не забывайте, что вы можете установить метатеги для таблиц _ENV и _G и запретить изменение этого метадаемого. Здесь Lua очень гибкая.

 Смежные вопросы

  • Нет связанных вопросов^_^