
Snusmumriken
06.02.2017
08:09:34
Кстати, crystal - это кто?

Плюшка
06.02.2017
08:09:41
Язык
Компилируемый, с синтаксисом ruby

Snusmumriken
06.02.2017
08:11:01
Во, загуглил. А то казалось что это сам графический двиг.
Lua встраивается куда угодно, поэтому вперёд.
Правда, я всё ещё не очень понимаю зачем.
Гуёвые приложения писать на crystal?
Или сразу на луях?
Может тогда уж сразу QT прикрутить к чистым луям, и либу-обёртку для сахара?

Google

Tverd
06.02.2017
08:12:09
Кристал - язык? Прикольно, было бы интересно

Плюшка
06.02.2017
08:12:23
Не, просто хочу этакий полуклон xray engine забабахать

Snusmumriken
06.02.2017
08:12:44
Ох вау, какие амбиции :3
Команда есть?

Плюшка
06.02.2017
08:12:53
Вон в кристал чатике жалуются, что игр не написали

Tverd
06.02.2017
08:14:06
А sdl есть на кристале? Прикручен? Можно было бы начать с графики на sdl

Snusmumriken
06.02.2017
08:14:25
Просто на полуклон xray, нужны сразу знания opengl/directx (желательно одновременно, или первый ибо универсален), графического конвейера, куча линала, физона и прочего матана. И куча времени. Двиглы так просто не делаются. Подозреваю что у xray около 15к человекочасов, не меньше так точно, скорее больше.
Ах да, даже если прикрутить sdl.
Хех, тогда уж сразу можно пилить на лов2d, ибо это - луёвая обёртка над SDL. При желании, можно и в 3d.

Плюшка
06.02.2017
08:16:53

Tverd
06.02.2017
08:17:21
отлично, тогда можно сразу прикрутить луа вторым этапом.

Snusmumriken
06.02.2017
08:17:51
Как прикручивать - можно глянуть сурцы лове. Там очень подробно описано использование SDL.

Tverd
06.02.2017
08:17:58
Как к кристалу биндить не знаю, к сям просто - и через чистый луа, и через ffi

Snusmumriken
06.02.2017
08:18:26
Дык тут кристал сам хостит lua. И экспортирует в него набор методов. Так же как ловка написанная на с++.
Только тут не с++ а кристал.

Google

Tverd
06.02.2017
08:21:36
Кстати, а как часто в лове ядро колбэчит luajit? один раз в кадр?

Snusmumriken
06.02.2017
08:21:49
В смысле?
При каждом require/loadstring, jit трассирует модуль на часто вызываемую фигню и компилит её.
Это всё.

Tverd
06.02.2017
08:23:28
Нене, я про то, что допустим в короне я могу подписаться на событие "update" которое вызывается раз в кадр.
Или допустим запустить таймер, который из ядра в нужное время вызовет колбек который я передал при иницализации

Snusmumriken
06.02.2017
08:24:50
А.
Не, тут всё проще.
Сишный код один раз вызывает функцию love.run, внутри которого находится бесконечный цикл, обновляющий таймеры, следящий за событиями и дёргающий love.update/love.draw как простые функции (при их существовании).

Tverd
06.02.2017
08:25:17
О, луп находится в луаджите?
то есть основной цикл обновления

Snusmumriken
06.02.2017
08:27:23
Luajit - это виртуальная машина.
Как ванильный интерпретатор lua, но со своими фичами, так же как есть много реализаций питона: и на java, и на c++ и на ruby, каждая со своими небольшими отклонениями. Тут - отклонения внутри довольно радикальные.
Да, основной цикл в самой луашке. Можно регулировать частоту кадров прям отсюда. Можно переписать love.run на свою любимую функцию. Швабодка!
Сама функция выглядит так:
https://love2d.org/wiki/love.run
Кстати, если хочешь обсуждать конкретно ловку - лезь в чуть другой чятик:
https://t.me/love2d_ru

Tverd
06.02.2017
08:31:15
Окай, буду знать про чат) Насчет луаджита - только его и использую )))
Еще вспомнил, под луа не видели имплементации менеджера корутин? Типа раз в кадр вызывается этот менеджер, проходит по всем созданым коручинам, обрабатывает и опять в спячку до следущего кадра

Snusmumriken
06.02.2017
08:35:56
Это же пять минут написать :3
Даже Роб писал: https://www.lua.org/pil/9.4.html

Tverd
06.02.2017
08:36:53
вот я и хочу написать ) а для начала глянуть как обычно делают. Нашел пару, но интересно может у кого есть что-то прям для продакшина
да, смотрю ) спасибо
Еще интересная задача, ну для меня точно ) Как максимально быстро пробежаться по таблице, при этом удаляя ее элементы.
Например вот:
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
тут проблема, что размер таблицы при удалении уменьшается...

Snusmumriken
06.02.2017
09:48:21
Я уже задавал народу эту задачку :3

Tverd
06.02.2017
09:48:33
Да? И какой был результат?

Google

Snusmumriken
06.02.2017
09:49:10
Народ начал ругаться что мой способ дико медленный (ибо таблицы тут вообще ниоч), и выдал свой класс двусвязных списков.

Tverd
06.02.2017
09:49:56
Хм, прямо так и медленный? Интересно

Snusmumriken
06.02.2017
09:50:00
А на практике, достаточно:
for i = #tbl, 1, -1 do
if something then table.remove(tbl, i) end
end
Экстремальная лаконичность.

Tverd
06.02.2017
09:50:21
Вот кстати обратный проход по таблице медленный )))))))))))))
тут соглашусь )

Snusmumriken
06.02.2017
09:50:35
Вот он - нет. Скорость идентична.
А удаление - медленное, ибо происходит куча сдвигов.

Tverd
06.02.2017
09:50:46
Щас потестим
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)
результат:
1.53125
1.4921875
стоп

Snusmumriken
06.02.2017
10:04:31
Ну ты понел.

Tverd
06.02.2017
10:05:00
1.34375
1.5
и так

Tverd
06.02.2017
10:05:05
короче равнозначны

Snusmumriken
06.02.2017
10:05:15
А теперь ещё раз запусти, и их значения могут поменяться местами из-за сборки мусора.

Tverd
06.02.2017
10:05:24
но писать твой варик быстрее конечно )))
Раньше тестировал, у меня был твой вариант медленнее... А это было года так 3 назад. Видать я тогда где-то намудрил

Snusmumriken
06.02.2017
10:08:19
Даже итератор:
`
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
06.02.2017
10:09:20
итератор немного медленнее ибо идет постоянный вызов фукции

Snusmumriken
06.02.2017
10:09:45
Раза в полтора. Если гонять по небольшим табличкам - ок, чуть больше комфорта.

Tverd
06.02.2017
10:10:41
Ну да, итераторы писать лучше на нестандартных данных... И красиво и понятно

Google

Tverd
06.02.2017
10:14:47
Забыл сказать, в твоем цикле мы проходим лишние запросы. Ибо таблица уже закончилась, а мы ее перебираем )

Snusmumriken
06.02.2017
10:31:00
В смысле?
Итерация прекращается если лямбда возвращает nil - nil.
Читай мануалы.

Tverd
06.02.2017
10:35:06
о как... стоп. Цикл это просто инкремент или в данном случае декремент по переменной.
Откуда цикл узнает о том что мы из таблицы забираем?
это если ipairs - то да

Snusmumriken
06.02.2017
10:47:16
Цикл - не узнаёт :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
06.02.2017
10:50:19
Нене, тут все верно, я про другой цикл for i=#tbl, 1, -1 do
И я ошибся, он не делает лишних движений

Admin
ERROR: S client not available

Snusmumriken
06.02.2017
10:53:46
Тебя слишком шокировала лаконичность? :3
Прям даже недоверие к крутости?

Tverd
06.02.2017
10:55:02
)))) типа того.
Доброе утро! Кто-нить знает как сделать такую штуку? Что бы подключить ffi мы должны описать хеадер и добавить его в ffi через cdef. И еще загрузить либу. А есть ли вариант сразу описать этот хидер в либе, и ее только зарекваирить?

yegorf1
07.02.2017
06:45:03
@Snusmumriken тут к тебе клиент

Tverd
07.02.2017
06:46:45
)))) Да я у всех спрашиваю, мож кто знает)

Snusmumriken
07.02.2017
06:51:16
Ой все.
Кароч, смотря какая либа.
Если своя - просто require.
Если чужая - полный список процедур.
И этим мы подключаем не FFI a dll/so.

Tverd
07.02.2017
07:04:30
Я видимо не так описал. Я пишу на С либу. В ней одна функция foo, которая написана не с луа биндингами, а как либа для другой проги на С. И пытаюсь понять, как ее написать так, что бы она бы нормально рекваирилась в луаджит. Можно через ffi интерфейс описать... А можно ли в С либе сделать такое описание? Но не как стандартное как для обычного луа.

Snusmumriken
07.02.2017
07:05:32
http://cs.brynmawr.edu/Courses/cs380/fall2011/luar-topics2.pdf

Tverd
07.02.2017
07:08:14
Да не, это для обычного луа. Так я делал...
Спасибо, но не то

Snusmumriken
07.02.2017
07:09:37
Для подключения произвольных либ через jit, таки пишем cdef, load и юзаем.
Хорошие люди ещё и делают обёртку вокруг всего этого в виде lua-либы.

Google

Tverd
07.02.2017
07:11:03
понятно, то есть в в луаджит либа bit написана как для обычного луа? без ffi?

Snusmumriken
07.02.2017
07:12:06
А то.
Зачем что-то ещё?
Обычная сишная либа написанная для луёв и встроенная в lua.dll/so

Tverd
07.02.2017
07:13:29
Понятно, спасибо
Хотел спросить, а никто не находил случайно photon.lua декомпилированную? Это фотоновская библиотека для работы с сетью reliable udp. Они ее раздают бесплатно, но скомпиленную, мне лично не удалось ее декомпилить...

Group Butler [beta]
08.02.2017
07:24:58
Добро пожаловать в чат pro.lua, Mykhas'! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Snusmumriken
08.02.2017
08:11:32

Tverd
08.02.2017
08:13:17
Ага, LuaDec виснет на в определенном месте, забивает всю память компа ) Можно переводить по функциям, но боюсь что большая часть исходников теряется при этом. Вот. А интересно почему, они реализовали Reliable UDP на голых UDP сокетах luasocket и на чистом луа.

Snusmumriken
08.02.2017
08:16:55
1. Есть enet, со схожим функционалом комнат и udp,
2. https://github.com/tarjoilija/rum/blob/master/rum.lua
Чем тебя udp не устраивает? Необходимостью строить оболочку вокруг, которая регулирует отправку сообщений пачками и их скорость, чтобы не забить канал?
UDP при этом гораздо, гораздо быстрее.
У TCP, перед отправкой сообщения, приходится посылать комбу "Готов? - Угу! - Принимай!", которая утраивает пинг. Кому это надо? :3

Tverd
08.02.2017
08:40:49
Дык я как раз и говорю что меня UDP как раз таки и устраивает! А Reliable UDP устраивает вдвойне! )))) щас посмотрю что там на гите

Snusmumriken
08.02.2017
08:41:22
На гите - просто образец штуки которая принимает-посылает пакеты.

Tverd
08.02.2017
08:42:13
ага, интересная штука, спасибо
enet юзаю, но его хрен прикрутишь к короне

Snusmumriken
08.02.2017
17:15:40
Там нельзя подключать dll-ки?
Берешь и подключаешь, через package.cpath или еще что-то такое.

Tverd
08.02.2017
17:51:24
Тут такой момент, если билдать готовое приложение, то либо это делается на сервере короны, либо нужно иметь платный интерпрайз. Если интерпрайз, то все норм, dll можно любые впихнуть, если фри версия, то только те, которые бесплатно и у них
Точнее не бесплатно, а расположенные на их сервере

yegorf1
08.02.2017
18:35:32
А кто-то юзал lua с mongo?

Snusmumriken
08.02.2017
18:40:39
Подозреваю что это аналогично redis'у.
Правда, там отдельный с++-драйвер

Lexxnsk
09.02.2017
01:52:17
/vzhuh@FailsBot

Mirocow
09.02.2017
02:04:49
/vzhuh@FailsBot
/vzhuh@FailsBot
/help@FailsBot