Igor
Igor
Его нельзя использовать за его пределами
Михаил
а, пон. а биндинги че не написали
Михаил
удобно же
Igor
Ды должны быть
Igor
Я лично сам всегда писал
Igor
Бибилиотека мелкая
Михаил
ВОТ
полный захват stdin/stdout на стандартной луашке без библиотек. но только на *nix и только для gdb
https://github.com/Koekto-code/gdbauto/blob/draft/iocapture.lua
Михаил
под луажитом работает быстрее чем просто гдб. наверно из-за того что цвета исчезли
Михаил
FIFO нормальная штука, и диск не засоряет
Михаил
судя по тому что он создался на NTFS, в винде тоже есть такое
Luсky
Шанс разбогатеть | Пикабу
https://pikabu.ru/story/shans_razbogatet_11207644
Всеволод
Снусмумрик, а ты уже играл в игру про Снусмумрика?
Snusmumriken
Test
Надо сделать игру про снусмумрика где снусмумрик играет в снусмумрика и тд
Snusmumriken
@Bot_for_AI держи
Snusmumriken
Uni_X
Это идеально
Luсky
Sony has opensourced the tools framework used by their first party game development studios. : r/gamedev
https://www.reddit.com/r/gamedev/comments/204duc/sony_has_opensourced_the_tools_framework_used_by/
Snusmumriken
0xSU
Snusmumriken
Это читы
0xSU
читер
Igor
Что это
dsmt = debug.setmetatable
0xSU
Igor
самый серьёзный чит в луях
Snusmumriken
Мне чот понравилось вешать метатаблички ко всему подряд
0xSU
Кст всегда забываю спросить, что делает rawset / rawget
Вставляют / Получают данные в в таблицу как RAW?)
Igor
Snusmumriken
Вставляют/получают данные из/в таблицы не дёргая метаметодов вроде __index/__newindex
0xSU
Благодарю
Igor
Igor
А теперь самая серьёзная часть
Igor
Snusmumriken
У меня щяс рофляная задача сделать всратолибу метатабличек на всё подряд, и чтобы она ещё хорошо комбилась с остальным моим барахлом, но без копипасты и зависимостей.
Snusmumriken
Вот с этим вот, тут не всё мета-либы но table/string/async вполне мета
Snusmumriken
Когда делаешь мета-мету, жизнь становится интереснее.
0xSU
Ты случайно не сервер на lua пилишь?)
Snusmumriken
Ох, я за свою жизнь СТОЛЬКО серверов на луа сделал, ты себе не представляешь. И большая их часть работает в продакшне.
0xSU
А что за основу брал? Curl?
Snusmumriken
Основа для сервера?
0xSU
Ну да
Snusmumriken
Курл не предоставляет слушающих сокетов. Это чисто клиентская либа, работающая с урлами. Собственно, её название "cURL" намекает.
Это она обращается к серверам по урлу и что-то с них хочет.
Snusmumriken
А так, в качестве основы для типовых луёвых серверов (хттп/тсп/амкп/юдп/фтп/смтп и далее) вполне подходит луасокет обыкновенный.
Открываешь такой порт и такой слушаешь, чаво туда придёт.
0xSU
Snusmumriken
Конечно можно.
0xSU
хотя это пол беды, io операции бы с корутинами
0xSU
Абалдеть
0xSU
А корутины особо память не кушают? Я просто не особо знаю, как это на низком уровне работает
0xSU
надо потестить ради интереса
Snusmumriken
Не особо. Открывать корутину для отдельных соединений это скорее норма.
Snusmumriken
Корутина это как бы отдельный луа-стейт с пошаренной памятью с основным. Там памяти сжирается на стек. Считай как пара функций по объёму.
0xSU
Snusmumriken
Таблички общие.
Snusmumriken
Корутины это не "потоки". Считай что это просто функции.
coroutine.yield фактически делает обычное goto из функции.
coroutine.resume фактически делает goto на последний yield из функции.
Snusmumriken
Всё что можно сделать с корутинами, можно сделать и без корутин. Но с корутинами удобнее писать асинхронный код, как будто бы он синхронный.
0xSU
Согласен, спасибо за разъяснение
Snusmumriken
Если функция в корутине что-то блокирует (долгий приём/передача или что-то такое) — ничего не будет происходить, всё встанет.
0xSU
Snusmumriken
Ну да, поток выполнения один
Но. Если у нас есть физическая возможность не блокировать (или блокировать, но на незначительное время) — мы можем легко распараллелить всякие штуки.
Всего того же самого можно было бы достичь конечным автоматом:
local state = {
sock = sock, -- неблокирующий
length = false,
data = "",
response = false
}
-- дёргаем эту функцию каждый тик пока не придёт ОК
function process_state(state)
if not state.length then
state.length = tonumber(state.sock:receive(5))
return
end
if #state.data <= state.length then
local chunk = state.sock:receive(2048)
if chunk then state.data = state.data .. chunk end
return
elseif not state.response
local request = state.data:sub(1, state.length)
state.response = PROCESS_REQUEST(request, state.sock)
return
end
if state.response and #state.response > 0 then
local chunk = state.response:sub(1, 2048)
state.response state.response:sub(2049)
state.sock:send(chunk)
return
end
return "OK"
end
Как ты понимаешь, функцию обработки приходится писать учитывающей кучу факторов "а в каком состоянии сейчас находится наше состояние чтобы что-то с ним делать", и даже в линейном сценарии, это довольно муторная фигня.
А если это надо модифицировать — ещё приходится постоянно думать, как это отразится на каждом из условий состояния.
0xSU
Что-то телеграмм прилег, новости последние ужас.
Snusmumriken
Что характерно, жаваскриптовые async-await, это единственный человеческий способ писать прямой человеческий код в этом вашем жаваскрипте, вместо колбеков погоняющих колбеками.
0xSU
Snusmumriken
На них надо будет посмотреть.
Но вообще, основной косяк корутин для бизнеса - ограничение их времени работы.
С другой стороны, никто не мешает написать coro_sleep которое будет рейзить ошибку при таймауте и заставлять корутину вылетать. И заставить все апи вроде сетевого использовать это по дефолту.
Snusmumriken
Мейлру просто делали файберы решая основную проблему ограничения времени выполнения
Snusmumriken
0xSU
Ага, ток эти файберы норм так памяти сжирают
Snusmumriken
А сколько ты хочешь?
Snusmumriken
Потому что луашные функции и таблички вон тоже прилично памяти сжирают, особенно если генерить их миллионами в минуту.
Snusmumriken
Строчки, кстати, тоже
0xSU
А сколько ты хочешь?
У меня просто был сервер на 1gb ram, и я пихал файберы во все что можно))
В итоге тестовые запросы на условно 10000 запросов, могли сожрать сильно много памяти
0xSU
по факту у меня нет 10000 запросов, максимум 100, но с тех пор, файберы я использую осторожно))
Snusmumriken
Я вот на днях прикручивал steamworks к love2d, и тут можно чекнуть потребление памяти при пересоздании кадров из местного модуля HTMLSurface (cef) из строчек (каждый кадр в fullhd rgba = ~8мб).
И без пересоздания (ffi.copy производит сырое копирование кадра по указателю в буферчик).
https://youtu.be/vZlRokg-nhc
0xSU
Snusmumriken
8мб на каждый кадр. Умножаем на 60 и получаем объём аллоков в секунду.
Snusmumriken
Грубо говоря, за секунду плодится ~500 мб мусора, который сборщику приходится срочно выгребать. Это без прямого копирования по указателю.
Snusmumriken
Там нет аллоков. Пара фреймбуферов (с двойной буферизацией, для чередования "это отображается в окне пока на этом рисуем") пересоздаётся только при изменении разрешения окна.
Там примерно ноль мусора.