void *
Прост
Snusmumriken
Кстати, crystal - это кто?
void *
Язык
void *
Компилируемый, с синтаксисом ruby
Snusmumriken
Во, загуглил. А то казалось что это сам графический двиг. Lua встраивается куда угодно, поэтому вперёд. Правда, я всё ещё не очень понимаю зачем. Гуёвые приложения писать на crystal? Или сразу на луях? Может тогда уж сразу QT прикрутить к чистым луям, и либу-обёртку для сахара?
Tverd
Кристал - язык? Прикольно, было бы интересно
void *
Не, просто хочу этакий полуклон xray engine забабахать
Snusmumriken
Ох вау, какие амбиции :3 Команда есть?
void *
Вон в кристал чатике жалуются, что игр не написали
Tverd
А sdl есть на кристале? Прикручен? Можно было бы начать с графики на sdl
Snusmumriken
Просто на полуклон xray, нужны сразу знания opengl/directx (желательно одновременно, или первый ибо универсален), графического конвейера, куча линала, физона и прочего матана. И куча времени. Двиглы так просто не делаются. Подозреваю что у xray около 15к человекочасов, не меньше так точно, скорее больше.
Snusmumriken
Ах да, даже если прикрутить sdl. Хех, тогда уж сразу можно пилить на лов2d, ибо это - луёвая обёртка над SDL. При желании, можно и в 3d.
Tverd
отлично, тогда можно сразу прикрутить луа вторым этапом.
Snusmumriken
Как прикручивать - можно глянуть сурцы лове. Там очень подробно описано использование SDL.
Tverd
Как к кристалу биндить не знаю, к сям просто - и через чистый луа, и через ffi
Snusmumriken
Дык тут кристал сам хостит lua. И экспортирует в него набор методов. Так же как ловка написанная на с++. Только тут не с++ а кристал. По сути, луа в лове дёргает с++ функции, которые дёргают sdl.
Tverd
Кстати, а как часто в лове ядро колбэчит luajit? один раз в кадр?
Snusmumriken
В смысле?
Snusmumriken
При каждом require/loadstring, jit трассирует модуль на часто вызываемую фигню и компилит её. Это всё.
Tverd
Нене, я про то, что допустим в короне я могу подписаться на событие "update" которое вызывается раз в кадр.
Tverd
Или допустим запустить таймер, который из ядра в нужное время вызовет колбек который я передал при иницализации
Snusmumriken
А. Не, тут всё проще. Сишный код один раз вызывает функцию love.run, внутри которого находится бесконечный цикл, обновляющий таймеры, следящий за событиями и дёргающий love.update/love.draw как простые функции (при их существовании).
Tverd
О, луп находится в луаджите?
Tverd
то есть основной цикл обновления
Snusmumriken
Luajit - это виртуальная машина. Как ванильный интерпретатор lua, но со своими фичами, так же как есть много реализаций питона: и на java, и на c++ и на ruby, каждая со своими небольшими отклонениями. Тут - отклонения внутри довольно радикальные. Да, основной цикл в самой луашке. Можно регулировать частоту кадров прям отсюда. Можно переписать love.run на свою любимую функцию. Швабодка!
Snusmumriken
Сама функция выглядит так: https://love2d.org/wiki/love.run
Snusmumriken
Кстати, если хочешь обсуждать конкретно ловку - лезь в чуть другой чятик: https://t.me/love2d_ru
Tverd
Окай, буду знать про чат) Насчет луаджита - только его и использую )))
Tverd
Еще вспомнил, под луа не видели имплементации менеджера корутин? Типа раз в кадр вызывается этот менеджер, проходит по всем созданым коручинам, обрабатывает и опять в спячку до следущего кадра
Snusmumriken
Это же пять минут написать :3 Даже Роб писал: https://www.lua.org/pil/9.4.html
Tverd
вот я и хочу написать ) а для начала глянуть как обычно делают. Нашел пару, но интересно может у кого есть что-то прям для продакшина
Tverd
да, смотрю ) спасибо
Tverd
Еще интересная задача, ну для меня точно ) Как максимально быстро пробежаться по таблице, при этом удаляя ее элементы. Например вот: local tbl = {1,2,3,4,5,6,7,8,9,10} local len, i = #tbl, 1 while true do if tbl[i] == 5 then table.remove(tbl, 5) len = len - 1 else — do_something() i = i + 1 end print(i, len) if len == i then break end end
Tverd
тут проблема, что размер таблицы при удалении уменьшается...
Snusmumriken
Я уже задавал народу эту задачку :3
Tverd
Да? И какой был результат?
Snusmumriken
Народ начал ругаться что мой способ дико медленный (ибо таблицы тут вообще ниоч), и выдал свой класс двусвязных списков.
Tverd
Хм, прямо так и медленный? Интересно
Snusmumriken
А на практике, достаточно: for i = #tbl, 1, -1 do if something then table.remove(tbl, i) end end Экстремальная лаконичность.
Tverd
Вот кстати обратный проход по таблице медленный )))))))))))))
Tverd
тут соглашусь )
Snusmumriken
Вот он - нет. Скорость идентична. А удаление - медленное, ибо происходит куча сдвигов.
Tverd
Щас потестим
Tverd
tbl1 = {} tbl2 = {} for i=1, 100000 do tbl1[i] = i tbl2[i] = i end stime = os.clock() for i=#tbl1, 1, -1 do if tbl1[i] % 10 == 0 then table.remove(tbl1, i) end end print(os.clock() - stime) stime = os.clock() local len, i = #tbl2, 1 while true do if tbl2[i] % 10 == 0 then table.remove(tbl2, i) len = len - 1 else — do_something() i = i + 1 end if len == i then break end end print(os.clock() - stime)
Tverd
результат: 1.53125 1.4921875
Tverd
стоп
Snusmumriken
Ну ты понел.
Tverd
1.34375 1.5 и так
Tverd
короче равнозначны
Snusmumriken
А теперь ещё раз запусти, и их значения могут поменяться местами из-за сборки мусора.
Tverd
но писать твой варик быстрее конечно )))
Tverd
Раньше тестировал, у меня был твой вариант медленнее... А это было года так 3 назад. Видать я тогда где-то намудрил
Snusmumriken
Даже итератор: ` function ripairs(t) local i = #t+1 return function() i = i - 1 local v = t[i] if v then return i, v end end end for i, v in ripairs({1, 2, 3, 4, 5}) print(i, v) end —> 5 5 4 4 3 3 2 2 1 1
Tverd
итератор немного медленнее ибо идет постоянный вызов фукции
Snusmumriken
Раза в полтора. Если гонять по небольшим табличкам - ок, чуть больше комфорта.
Tverd
Ну да, итераторы писать лучше на нестандартных данных... И красиво и понятно
Tverd
Забыл сказать, в твоем цикле мы проходим лишние запросы. Ибо таблица уже закончилась, а мы ее перебираем )
Snusmumriken
В смысле? Итерация прекращается если лямбда возвращает nil - nil. Читай мануалы.
Tverd
о как... стоп. Цикл это просто инкремент или в данном случае декремент по переменной.
Tverd
Откуда цикл узнает о том что мы из таблицы забираем?
Tverd
это если ipairs - то да
Snusmumriken
Цикл - не узнаёт :3 а in - узнаёт, когда к нему приходят nil/nil. Фактически, in идентичен этому: local iter = ipairs(t) local res, q, w, e, r, t, y = iter() while res do ... код цикла res, q, w, e, r, t, y = iter() end На самом деле тут нет всяких q, w, e, r, t, y, количество аргументов неограничено: local iter = ipairs(t) local res = {iter()} while #res>0 do cyclefunction(unpack(res)) res = {iter()} end
Tverd
Нене, тут все верно, я про другой цикл for i=#tbl, 1, -1 do
Tverd
И я ошибся, он не делает лишних движений
Snusmumriken
Тебя слишком шокировала лаконичность? :3 Прям даже недоверие к крутости?
Tverd
)))) типа того.
Tverd
Доброе утро! Кто-нить знает как сделать такую штуку? Что бы подключить ffi мы должны описать хеадер и добавить его в ffi через cdef. И еще загрузить либу. А есть ли вариант сразу описать этот хидер в либе, и ее только зарекваирить?
Yogurt
@Snusmumriken тут к тебе клиент
Tverd
)))) Да я у всех спрашиваю, мож кто знает)
Snusmumriken
Ой все. Кароч, смотря какая либа. Если своя - просто require. Если чужая - полный список процедур. И этим мы подключаем не FFI a dll/so.
Tverd
Я видимо не так описал. Я пишу на С либу. В ней одна функция foo, которая написана не с луа биндингами, а как либа для другой проги на С. И пытаюсь понять, как ее написать так, что бы она бы нормально рекваирилась в луаджит. Можно через ffi интерфейс описать... А можно ли в С либе сделать такое описание? Но не как стандартное как для обычного луа.
Snusmumriken
http://cs.brynmawr.edu/Courses/cs380/fall2011/luar-topics2.pdf
Tverd
Да не, это для обычного луа. Так я делал...
Tverd
Спасибо, но не то
Snusmumriken
Для подключения произвольных либ через jit, таки пишем cdef, load и юзаем. Хорошие люди ещё и делают обёртку вокруг всего этого в виде lua-либы.
Tverd
понятно, то есть в в луаджит либа bit написана как для обычного луа? без ffi?
Snusmumriken
А то. Зачем что-то ещё? Обычная сишная либа написанная для луёв и встроенная в lua.dll/so
Tverd
Понятно, спасибо