void *
Прост
Snusmumriken
Кстати, crystal - это кто?
void *
Язык
void *
Компилируемый, с синтаксисом ruby
Snusmumriken
Во, загуглил. А то казалось что это сам графический двиг.
Lua встраивается куда угодно, поэтому вперёд.
Правда, я всё ещё не очень понимаю зачем.
Гуёвые приложения писать на crystal?
Или сразу на луях?
Может тогда уж сразу QT прикрутить к чистым луям, и либу-обёртку для сахара?
Tverd
Кристал - язык? Прикольно, было бы интересно
void *
Не, просто хочу этакий полуклон xray engine забабахать
Snusmumriken
Ох вау, какие амбиции :3
Команда есть?
void *
Вон в кристал чатике жалуются, что игр не написали
void *
Tverd
А sdl есть на кристале? Прикручен? Можно было бы начать с графики на sdl
Snusmumriken
Просто на полуклон xray, нужны сразу знания opengl/directx (желательно одновременно, или первый ибо универсален), графического конвейера, куча линала, физона и прочего матана. И куча времени. Двиглы так просто не делаются. Подозреваю что у xray около 15к человекочасов, не меньше так точно, скорее больше.
Snusmumriken
Ах да, даже если прикрутить sdl.
Хех, тогда уж сразу можно пилить на лов2d, ибо это - луёвая обёртка над SDL. При желании, можно и в 3d.
void *
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
Понятно, спасибо