Привязки Lua к C ++ и сборка мусора
Вопрос
Хорошо, вот проблема, с которой я столкнулся.
У меня есть привязки Lua к движку рендеринга, у которого есть внутренний менеджер рендеринга, который ведет свой собственный учет указателей для сцены рендеринга и управляет ими.Проблема в том, что когда я использую его из Lua, если я не сохраняю ссылку Lua на каждый отдельный объект, который я добавляю в диспетчер рендеринга C ++, он начинает собирать мусор указателей и, конечно, приводит к сбою.Я не особенно хочу сохранять каждую ссылку на каждую вещь, которую я создаю.Есть ли способ заставить Lua не собирать мусор определенными вещами?Есть ли какие-либо другие способы, которыми я могу обойти эту проблему?
Я генерирую привязки Lua с помощью SWIG.
Решение
Простой способ предотвратить сбор мусора Lua для объекта - поместить этот объект в таблицу (вызвать его uncollectable
) а затем поместить эту таблицу в реестр Lua.
Другой ваш вариант - использовать дополнительный уровень косвенности с каждым объектом Lua, т. Е. использовать "легкие пользовательские данные".Пользовательские данные light указывают на указатель на объект C ++, и даже если пользовательские данные light собраны, базовый объект остается невредимым.
Эти объяснения довольно лаконичны, но я надеюсь, что с помощью Программирование на Lua, вы можете превратить один из них в рабочий код.