
Snusmumriken
05.04.2017
13:07:22
Ты глянь-то. Там есть ООП.
Просто максимально быстрое, с минимумом поисков и переходов по ссылкам.
P.S. Завернуть говнокод в ООП - лишь чуть сложнее чем в линейном коде )))

Антон
05.04.2017
13:08:16
то что я описал это не говнокод
это инкапсуляция реализации

Google

Snusmumriken
05.04.2017
13:09:54
Ну, понимаешь ли в чём проблема. Лично я не буду использовать такой подход в хайлоаде, ибо это замедляет исполнение программы. Когда тебе нужно держать приемлемый fps на 300к объектах с кучей векторных операций над каждым - хочешь не хочешь а будешь оптимизировать всё до усрачки :3
Тот случай, когда читаемость < производительность.
Кстати, всё более чем читаемо.

Антон
05.04.2017
13:11:00
вы с таким количетсвом объектов в луа работаете?

Snusmumriken
05.04.2017
13:11:05
О да.
Я ещё пишу хайлоад-серверные приложения на луа, с 1.5-2млн запросов в секунду.

Антон
05.04.2017
13:11:23
мне кажется я нашел проблему)

Snusmumriken
05.04.2017
13:12:02
И знаешь в чём прекол?
Luajit.

Антон
05.04.2017
13:12:04
я бы в нативную часть выносил хайлоад, но это конечно уже поздно делать

Snusmumriken
05.04.2017
13:12:22
Luajit'а достаточно для всей фигни.

Антон
05.04.2017
13:12:43
а jit гарантирует отсутсвие кешмисов?
я просто хз насколько он кеш-френдли код генерит

Snusmumriken
05.04.2017
13:13:27
Ну, раз его юзает мыло в веб-хайлоаде, подозреваю что да ))
На моей памяти - жутко стабильная штука, плюс самая быстрая виртуалка для скриптов на текущий момент. V8 может в чём-то уже опережает, но несильно, и в жыте гарантированное отсутствие оверхеда на дёргание c/c++ либ.

Google

Антон
05.04.2017
13:15:03
подозрительно все это

Snusmumriken
05.04.2017
13:15:55
Тебе это может показаться выжиганием сахарных сердечек на торте паяльником (т.е. долго, дорого и болезненно), но фигня в том, что луа-код быстрее писать и проще отлаживать, а работает (jit) незначительно медленнее сишки.

Антон
05.04.2017
13:18:55
нет мне кажется тчо это какбе вилами на воде писано. почему? потомучто люди рендер пишут или тулы игровые и боятся функции виртуалить и иф лишний написать, все о кешмисах парятся, стараются мемори-френдли писать, без дыр в памяти, на с++, разыменовывают не больше одго раза, а тут такой luajit - на скриптовом языке пиши как хочешь, а они не знают про него, мучаются

Snusmumriken
05.04.2017
13:19:18
Хе-хе-хе-хе-хе :3
Простите, не удержался.

Антон
05.04.2017
13:19:37
¯\_(ツ)_/¯

zk
05.04.2017
13:19:46

Snusmumriken
05.04.2017
13:20:03
Попробуй zerobrane.

Антон
05.04.2017
13:20:03
вопрос на миллион да
дебажить логами становится тяжело)

Snusmumriken
05.04.2017
13:20:34
https://studio.zerobrane.com/

Антон
05.04.2017
13:20:38
мне товарищь порекомендовал zerobrane

zk
05.04.2017
13:20:46

Антон
05.04.2017
13:20:48
ага но для этого надо собрать luaSocket в проек

zk
05.04.2017
13:20:55
на эклипсе

Антон
05.04.2017
13:20:58
а на винде он аутдейтед

Snusmumriken
05.04.2017
13:21:17
Ну, я дебажу логами и юниттестами в notepad++, за пару годочков привык.
Какой тебе luasocket? Берёшь luarocks и ставишь произвольные либы.
Могу закидать тебя вендовыми либами, их море.
Или ты сам можешь заграбастать:
https://luapower.com/
https://github.com/rjpcomputing/luaforwindows

Антон
05.04.2017
13:22:45
luarocks это не то. это только менеджер. а чтобы код модуля запустился ты при сборке должен функции собрать натиыне чтобы луа к ним подключался

zk
05.04.2017
13:22:53

Snusmumriken
05.04.2017
13:23:47

Google

zk
05.04.2017
13:23:48
а еще майкрософт запилили поддержку лувы в студии

Антон
05.04.2017
13:24:44
что проще получается - всех заставить поставить и настроить или зашить нужные модули в проект чтоб у всех просто заработало?


Snusmumriken
05.04.2017
13:25:58
Папочка libs в проекте, со структурой:
x86: lib.dll; lib.so;
x64: lib.dll; lib.so;
arm: lib.dll; lib.so;
В зависимости от оси, пихаешь в package.cpath ту или иную папку.
Ну да, или зашиваешь и линкуешь, тоже можно.
Благо сурцы либ есть на гитхабе.
Да, ты знаешь почему я ещё так активно использую lua в том числе в хайлоаде?
Как раз из-за портабельности и отсутствии необходимости в перекомпиляции под новую платформу. Только луароксом либы подгрести, или заранее скомпилить всё чем бы пользуешься под все основные платформы/разрядности, и линковать в рунтайме папку с этими либами в зависимости от текущей платформы. Это как ifdef IOS, только подгребается папка. Ну да, тут десктопные/серверные приложения, в основном. Но даже на ведроиде всё ок.
И да, такая конструкция без каких либо изменений будет работать везде, если запускают через виртуалку.


Vlad
05.04.2017
14:12:07
как избавиться от .0 в числах, только что б все было целенькое и красивенькое при выводе в консоль? это важно?
без применения math
(или форматирования)

Snusmumriken
05.04.2017
14:13:16
Для вывода в консоль -
print(('Data: %2.2f, %2.4f, %-0.2f'):format(0.0123123123, 0.01234123, 2.1234123))
Форматирование чем не угодило? :3

Group Butler [beta]
05.04.2017
14:13:37
Добро пожаловать в чат pro.lua, Sam! Ознакомься с правилами чата (в описании и прикрепленном сообщении), и присоединяйся к обсуждению.

Vlad
05.04.2017
14:14:15
ну у меня просто такие задвиги, временами бывает, вот хочу но без всего что б

zk
05.04.2017
14:15:02

Vlad
05.04.2017
14:15:32
ну это да, а так что б совсем

zk
05.04.2017
14:15:50
что совсем?

Snusmumriken
05.04.2017
14:15:51
formatted = tostring(number):match'(.*)%.?'

Tverd
05.04.2017
14:16:05
("%i"):format(i)

Snusmumriken
05.04.2017
14:16:21
Тут товарищ без форматирования хочет :3

Google

Tverd
05.04.2017
14:17:00
боюсь не выйдет такой трюк ) тут double to int отсутствует

Vlad
05.04.2017
14:17:07
у меня к примеру что то :
x = x - (x % 1)
а потом убрать .0

Tverd
05.04.2017
14:17:46
хотя конечно можно подумать

Snusmumriken
05.04.2017
14:18:06
Ой всё, форматирование эффективнее :3

Tverd
05.04.2017
14:19:21
а через луаджит нельзя? допустим описать структуру с int, туда пихнуть значение и забрать

Snusmumriken
05.04.2017
14:20:39
Можно.
int = ffi.new('int')
int = 123123.123123123 -> 123123

Tverd
05.04.2017
14:23:08
о, отлично, хотя бы для луаджит возможно

Snusmumriken
05.04.2017
14:23:28
Луаджит умеет всё что умеет сишка. Даже стандартная сишкина либа уже подрублена.

Admin
ERROR: S client not available

Snusmumriken
05.04.2017
14:23:37
http://luajit.org/ext_ffi.html

Ilya
05.04.2017
16:30:44
Есть кто lapis-ом пользуется?

Snusmumriken
05.04.2017
16:53:44
Только openresty в голом виде.
И для очень простых задач.

Антон
05.04.2017
18:33:25
Применение типа:
foo = Class()
function foo:init(x, y)
local o = {}
o.x, o.y = x, y
return self.Inst(o)
end
function foo:foobar(z)
self.x, self.y = self.x + z, self.y - z
end
bar = Class('bar', foo) -- наследование
function bar:init(x, y, w, h)
local o = self.Super(x, y)
-- доступ к батьке батьки - self.Super.Super
o.w, o.h = w, h
return self.Inst(o)
end
function bar:bar(z)
self.x = self.x + self.h - z
end
obj = foo(10, 20)
obj:foobar(2)
obj2 = bar(10, 20, 30, 40)
obj2:bar(12)
obj2:foobar(4) -- наследованный метод
почему наследование через bar = Class('bar', foo) -- наследование
что значат ппараметры в скобках?

yegorf1
05.04.2017
18:38:36
Заикается

Philipp
05.04.2017
18:39:53
А что з-з-значат п-п-параметры в скобках? (сглатывает)

Антон
05.04.2017
19:00:19
тот пример тоже не работает вот в таком случае
вот это работает норм
Quest = Class('Quest', EventListener)
function Quest:init(body)
local o = self.Super()
o.condition = nil
o.body = body
o.co = coroutine.create(body)
return self.Inst(o)
end
вот это крашится

Google

Антон
05.04.2017
19:01:05
Quest = Class('Quest', EventListener)
function Quest:init(body)
local o = self.Super()
o.condition = nil
o.body = body
o.co = coroutine.create(o.body)
return self.Inst(o)
end
тоесть если мембер вариабл вызывать то краш
[string "Scripts/Quests/questLogic.lua"]:38: attempt to call a nil value (field 'condition')
делаю так:
function Quest:interrupt(condition)
print('condition', condition)
self.condition = condition
coroutine.yield()
end
-- вызываю так:
local condition
condition = function (a)
print('coroutine condition print')
return 'success'
end
print('coroutine condition', condition)
quest.interrupt(condition)
выводит:
coroutine condition function: 0x218df60
condition nil
она получается не передается в функцию
как такое возможно
https://www.lua.org/cgi-bin/demo
тут тоже самое выдает
о нашел - двоеточие надо было поставить
йоу а как делать множественное наследлвание?
или вы юзаете дак-тайпинг?


Snusmumriken
06.04.2017
00:58:50
Множественное наследование - это вместо таблицы в __index - функция, которая перебирает ключи классов. И это медленно и стрёмно. Даже не думай никогда о множественном наследовании.
Проще уж миксины, делаются аналогично: в __index - функция, перебирающая миксины и один наследуемый класс.
Миксины - маленькие таблички с небольшим набором методов. Я могу такое сделать, но всё равно будут большие косяки со многими вещами. Особенно с отладкой.

Рома
06.04.2017
01:23:08
Хм, и чем тогда "множественное наследование" отличается от миксинов? Вовсе и не стремно, функцию __index специально придумали, чтобы всякие javascript'ы завидовали

Tverd
06.04.2017
07:42:51
Множественно наследование может иметь множество инициализаторов... которые надо проходить в момент создания объекта... Миксины обычно без инициализаторов

Антон
06.04.2017
09:42:37
хорошо, а если вариант с одним предком и множеством интерфейсов?
надо указать что объект реализует какие-то функции, ну например есть интерфейс EventListener, у него есть метод OnEvent(). есть EventDispatcher с методом addListener, в который передается инстанс EventListener-а - так как мваров там не надо, до хватит и формальной реализации протокола - EventDispatcher будет вызывать метод OnEvent()

Tverd
06.04.2017
09:46:12
Ну вот миксины считай что-то типа интерфейсов

Антон
06.04.2017
09:46:25
а приведи пример
вот есть MyObject = Class()