Size: a a a

2019 October 31

A

Andrey in pro.lua
просто я через него открыл для себя lua, отличная штука
источник

S

Snusmumriken in pro.lua
Сорц под лав2д https://pastebin.com/LwFgRX9B
источник

A

Andrey in pro.lua
тогда ещё вопрос: какие-то есть советы/подводбные камни для поддержки hot reloading в движке? ну т.е. пока у меня план на уровне "принимать от директори вотчера колбеки и перезагружать весь модуль"
источник

S

Snusmumriken in pro.lua
Надо ещё перезагружать все объекты, созданные тем модулем.
источник

S

Snusmumriken in pro.lua
Иначе сборщик мусора не соберёт "старый" модуль, так и будет крутить, пока на него есть ссылки.
источник

A

Andrey in pro.lua
хм, т.е. можно сделать подсчёт ссылок, например, на модуль
источник

A

Andrey in pro.lua
и объекты периодически будут поллить, что модуль сдох
источник

A

Andrey in pro.lua
и убирать реф? :О
источник

A

Andrey in pro.lua
спасибо, почитаю позже
источник

S

Snusmumriken in pro.lua
Помнится, у луа есть интроспекция, но без доступа к ссылкам.
Что можно сделать, так это писать код так, что составляется список объектов у данного модуля (или хуки на функции типа :new()), и после перезагрузки у них вызывается деструктор, и тут же обратно конструктор (можно и тупой подменой метатаблицы, если это таки объекты, но надо будет время от времени перезагружать).
источник

A

Andrey in pro.lua
даже не так. объекты просто хранят генерацию модуля и периодически сверяют с текущей
источник

A

Andrey in pro.lua
Snusmumriken
Помнится, у луа есть интроспекция, но без доступа к ссылкам.
Что можно сделать, так это писать код так, что составляется список объектов у данного модуля (или хуки на функции типа :new()), и после перезагрузки у них вызывается деструктор, и тут же обратно конструктор (можно и тупой подменой метатаблицы, если это таки объекты, но надо будет время от времени перезагружать).
хмм. мб вообще тогда весь стейт хранить как "pod", т.е. без поведения
источник

A

Andrey in pro.lua
и перегружать токо функции
источник

S

Snusmumriken in pro.lua
А какие возможности даёт хот релоадинг? Можно писать код и как бы сразу смотреть на происходящее? Но зачем?
источник

A

Andrey in pro.lua
ну да, хочется при нажатии CTRL+S в редакторе видеть изменения. просто у меня движок на плюсах, и я уже устал страдать от рекомпиляций и рестарта
источник

A

Andrey in pro.lua
т.е. например мне щас надо на imgui накатать пару интерфейсов
источник

S

Snusmumriken in pro.lua
Есть более простой и хардкорный способ перезагрузки. Ты в самом начале реквайришь какую-нибудь фигню, она составляет эталонное дерево _G вместе со списком сорцов и их размеров/хешей, и ты обновляешь её условно раз в несколько кадров. Оно смотрит, не изменилось ли чего, и если изменилось — восстанавливает эталонную _G, вызывает collectgarbage и реквайрит главный луёвый файл, который потом заново подгружает все объекты.
источник

S

Snusmumriken in pro.lua
Но это только если у тебя вся движковая часть на луях, а плюсы — просто набор функций оперирования фреймворком: нарисовать чонить, загрузить-запустить звучок и т.п. Ну и оно каждый раз стартует заново, а не с того места где всё происходило в прошлый заход (что хорошо ибо минус ошибки).
источник

A

Andrey in pro.lua
Snusmumriken
Есть более простой и хардкорный способ перезагрузки. Ты в самом начале реквайришь какую-нибудь фигню, она составляет эталонное дерево _G вместе со списком сорцов и их размеров/хешей, и ты обновляешь её условно раз в несколько кадров. Оно смотрит, не изменилось ли чего, и если изменилось — восстанавливает эталонную _G, вызывает collectgarbage и реквайрит главный луёвый файл, который потом заново подгружает все объекты.
не совсем понял про восстановление _G - тогда же ты потеряешь текущий стейт полностью?
источник

S

Snusmumriken in pro.lua
Да, фактически это полная перезагрузка : )
источник