Andrey
ок! а премейк здесь не принято обсуждать?
Snusmumriken
Да не, можно
Andrey
просто я через него открыл для себя lua, отличная штука
Snusmumriken
Сорц под лав2д https://pastebin.com/LwFgRX9B
Andrey
тогда ещё вопрос: какие-то есть советы/подводбные камни для поддержки hot reloading в движке? ну т.е. пока у меня план на уровне "принимать от директори вотчера колбеки и перезагружать весь модуль"
Snusmumriken
Надо ещё перезагружать все объекты, созданные тем модулем.
Snusmumriken
Иначе сборщик мусора не соберёт "старый" модуль, так и будет крутить, пока на него есть ссылки.
Andrey
хм, т.е. можно сделать подсчёт ссылок, например, на модуль
Andrey
и объекты периодически будут поллить, что модуль сдох
Andrey
и убирать реф? :О
Andrey
Snusmumriken
Помнится, у луа есть интроспекция, но без доступа к ссылкам.
Что можно сделать, так это писать код так, что составляется список объектов у данного модуля (или хуки на функции типа :new()), и после перезагрузки у них вызывается деструктор, и тут же обратно конструктор (можно и тупой подменой метатаблицы, если это таки объекты, но надо будет время от времени перезагружать).
Andrey
даже не так. объекты просто хранят генерацию модуля и периодически сверяют с текущей
Andrey
Andrey
и перегружать токо функции
Snusmumriken
А какие возможности даёт хот релоадинг? Можно писать код и как бы сразу смотреть на происходящее? Но зачем?
Andrey
ну да, хочется при нажатии CTRL+S в редакторе видеть изменения. просто у меня движок на плюсах, и я уже устал страдать от рекомпиляций и рестарта
Andrey
т.е. например мне щас надо на imgui накатать пару интерфейсов
Snusmumriken
Есть более простой и хардкорный способ перезагрузки. Ты в самом начале реквайришь какую-нибудь фигню, она составляет эталонное дерево _G вместе со списком сорцов и их размеров/хешей, и ты обновляешь её условно раз в несколько кадров. Оно смотрит, не изменилось ли чего, и если изменилось — восстанавливает эталонную _G, вызывает collectgarbage и реквайрит главный луёвый файл, который потом заново подгружает все объекты.
Snusmumriken
Но это только если у тебя вся движковая часть на луях, а плюсы — просто набор функций оперирования фреймворком: нарисовать чонить, загрузить-запустить звучок и т.п. Ну и оно каждый раз стартует заново, а не с того места где всё происходило в прошлый заход (что хорошо ибо минус ошибки).
Andrey
Snusmumriken
Да, фактически это полная перезагрузка : )
Andrey
ну это тогда TOTAL hot reloading :D
Snusmumriken
Фигня в том, что если ты изменяешь стейт в процессе кодирования, этот стейт перестаёт соответствовать какому либо коду. И из-за этого могут быть ошибки. Точнее, они 100% будут.
Andrey
ну да, поэтому я ранее писал про то, мол, стейт хранить отдельно, а функции отдельно
Andrey
и если изменился файл из папки state условной, то сори - не получится
Andrey
хотя можно конечно рискнуть и зафорсить, лол
Snusmumriken
Хмм, кстати, допустим ты добавил новое поле объекту, и функции которые его используют. Что этот объект должен сделать? Пересоздаться на той позиции где был? У него должно добавиться это новое поле и подмениться метатаблица или что?
Snusmumriken
(slozhna)
Andrey
ну в идеале, конечно, он должен пересоздаться и дальше жить, ничего не заметив
Andrey
фактически можно какой-нибудь условный table.merge делать и надеяться на лучшее
Snusmumriken
Хмм, он мог быть в каком-то сложном состоянии, типа "я ща готовлюсь выстрелить, вот даже анимацию запустил", оно сбросится или застрянет где-то между (рассинхрон между геймстейтом и рендерстейтом). Вот в том числе поэтому и slozhna.
Andrey
ну предположим, что у тебя не объект, а отдельно его state
Andrey
и ф-ции, к-е над ним оперируют
Snusmumriken
Угу
Andrey
ты обновил и стейт, и функции
Andrey
они как-то смержились
Andrey
что мешает тот же animationState смержить
Andrey
который потом будет так же продолжать анимацию, но уже с другим объектом
Andrey
у тебя progress перекочевал на новый объект animationState
Snusmumriken
Да, если не пользоваться ООП, а врубить какие-нибудь ECS, то становится попроще.
Andrey
дада, я примерно и думал про это
Andrey
slozhna, конечно, такое заранее продумать. видимо буду писать и выяснять на практике(своих ошибках)
Snusmumriken
Лично я прост не пользуюсь хот-релоадингом (и не писал либ для этого) именно из-за того, что я быстро перестану понимать что происходит, пока пишу. Типа, зачем мне продолжать тянуть ошибку в этом стейте, и не одну.
Andrey
согласен, тратить время на "отладку" сумасшествия не хотелось бы. по ощущениям нужны какие-то способы проверить, что у тебя всё сломаться может потенциально, и в этом случае давать ворнинг или вообще отключить перезагрузку. т.е. пока ты меняешь только логику ф-й - всё ок. а со стейтом не шутить
Snusmumriken
А лайв-кодеры типа как у юнити — они хороши только в простейших случаях. И в целом, в движке с этим немного проще, юзер ограничен по самое не балУй, заранее более-менее известна структура приложения, можно за что-то зацепиться, вместо того чтобы поддерживать все на свете возможные случаи.
Andrey
ну я бы не сказал, что только в простейших - встречал очень большой движок, где это полезно было. но работало в 20% случаев :)
Andrey
но хотя бы в остальных 80% просто писало, мол, сори, не получилось
Snusmumriken
Ну вот, я про это и говорю, оно ломается если пытается перезагрузить что-то _не простейшее_ : )
Andrey
тем временем я затестил lua-fmt и luafmt
Andrey
и там действительно нельзя настроить так, чтобы таблицы не ломались :<
Snusmumriken
Это довольно специфическая задача, и мало кто ей заморачивается. Плюс очень сложно отличить табличное форматирование от просто рандомных пробелов. Очень много мороки.
Igor
Кстати на счёт ловки, там 11.3 релизнулась
Igor
Недавно игрался с ловкой в попытках накатать голосовой чат по udp, вроде получилось, но не понимал, почему на ведре он ни в какую доступ к микрофону не запрашивал, пока не заглянул в исходники, оказалось микрофон и не был реализован, а 11.3 уже не глухая и слушать умеет
Ivan
Есть такой оличный сайт https://leetcode.com/ Там есть куча задачек на программирование разной степени сложности. Но там, к сожалению, нет поддержки lua. Может быть есть какой-то подобный ресурс где можно потренироваться с lua?
Satbek
Ivan
слушай, а на хакерранке есть луа? я по диагонали посмотрел, сходу не вижу
Satbek
есть
Satbek
Ivan
огонь! спасибо!
Roman
fyi: некоторые работадатели просят линк на профиль hackerrank или дают там задачки
Anonymous
Всем привет! Ребята, тут есть владельцы стоматологий или те, чьи друзья собственники клиник ?
Мы делаем комплексный маркетинг в стоматологиях.
Приводим от 200 пациентов в клинику за месяц, первые 30 пациентов в первые 7 дней. С гарантией выполнения работ по договору.
Пишете в ЛС кому актуально.
fgntfg
Anonymous
Интересно как они ето делают
Ivan
Зубы белые и сияют - как Луна
Anonymous
Мультов приводят или зубы выбивают кому
Anonymous
Можно зеков организовать на такое дело, наверное
fgntfg
С одной стороны хочется писать код, а с другой - лежать на кровати как блинчик.
Ж
Сюда пора бы уже завести бота - кикера
Νῑκόλαος
Шта??
Νῑκόλαος
Вот это луа походу правильный)
Артём
Неужели Снус наконец то решил жениться
Egor
слишком большой "луа"
Dmitriy
объясните пожалуйста поведение... есть код: function miniMaxSum(arr)
function sum(arg, ...)
local total = arg
local addarg = {...}
for _,v in pairs(addarg) do total = total + v end
return total
end
table.sort(arr)
print(string.format("%d %d", sum(table.unpack(arr,1,#arr-1)), sum(table.unpack(arr,2,#arr))))
return
end
Dmitriy
есть тест: describe('MiniMaxSum', function ()
it('sample data', function ()
assert.are.equal("10 14", miniMaxSum({1, 2, 3, 4, 5}))
end)
end)
Dmitriy
функция работает нормально, но вот запуск теста говорит .\MiniMaxSum.lua:8: attempt to perform arithmetic on local 'total' (a nil value)
Dmitriy
почему?
Snusmumriken
Ivan
фото проститутки
Snusmumriken
объясните пожалуйста поведение... есть код: function miniMaxSum(arr)
function sum(arg, ...)
local total = arg
local addarg = {...}
for _,v in pairs(addarg) do total = total + v end
return total
end
table.sort(arr)
print(string.format("%d %d", sum(table.unpack(arr,1,#arr-1)), sum(table.unpack(arr,2,#arr))))
return
end
Несколько правок.
1. Функции table.unpack нет у lua 5.1, стоит сначала написать
local unpack = unpack or table.unpack
для совместимости;
2. Функция table.sort изменяет передаваемую таблицу. Это может быть вредно;
3. Функция sum, которая принимает переменное число аргументов будет работать некорректно, если в таблице более пары тысяч значений (зависит от зашитой в луа константы), оно может упасть с переполнением луа-стека;
4. Что функция miniMaxSum возвращает? Она только принтит, как assert.are.equal определит, что ей вернула функция?