В школьном проекте я использую Lua, чтобы добавить некоторые скриптовые функции в игровой движок.Движок загружается довольно медленно, поэтому вместо того, чтобы перезапускать его каждый раз, когда я меняю один из моих сценариев Lua, я бы хотел просто перезагрузить сценарии.Я хотел бы иметь возможность делать это безопасным и надежным способом, даже если другие авторы сценариев загрязняют глобальное состояние непредсказуемым образом.
На мой взгляд, самый простой способ сделать этопросто уничтожить lua_State
в моем коде C ++, а затем создать новый, заново связать мои функции и перезагрузить все необходимые сценарии.Тем не менее, у меня возникли некоторые проблемы, чтобы заставить его работать правильно.У меня есть класс, который служит интерфейсом для виртуальной машины Lua, которая имеет следующий конструктор и деструктор:
LuaInterface::LuaInterface()
{
luaVM = lua_open();
luaL_openlibs(luaVM);
// Create the ortsgfx table.
lua_newtable(luaVM);
lua_setglobal(luaVM, TABLE_NAME);
}
LuaInterface::~LuaInterface()
{
// Close the Lua virtual machine
lua_close(luaVM);
}
Обратите внимание, что lua_close (luaVM) вызывается при выполнении деструктора объекта.Я пытаюсь сбросить Lua из игрового движка с помощью следующего кода:
lua.~LuaInterface();
lua = LuaInterface();
initLua();
(Lua - это, конечно, объект LuaInterface.) Это вызывает ошибку сегментации в initLua()
, когда я пытаюсь инициализировать один измои столы Однако, если я удаляю вызов lua_close(luaVM)
в деструкторе, то все работает нормально.
Что я делаю не так?Кроме того, есть ли лучший способ перезагрузить мои скрипты Lua?