7
там jitlua?
Vasiliy
кто-то прикручивал jit, мы не использовали в продакшене из-за крашей
Vasiliy
jit немного более падучий на некоторых андроидах...
Vasiliy
собственно да, из любой сишной ide. Вот луа я никогда не дебажил дебаггером
Snusmumriken
Хотя на самом деле, с луями довольно сложно, потому что они любят просто дропать нафиг всё приложение без суда и следствия, если где-то что-то неправильное.
Поэтому можно сделать либу, написать на сишке тест-кейс как если бы это было луа-хост-приложение и дебагать в IDE.
Потом ненужный функционал отключить и дооформить динамик-либой.
Ну, типа сначала тестим изнутри сишки, потом тестим в луях, когда сишка гарантированно пашет.
Но тут проблемы с модификациями и выпусками новых версий.
Snusmumriken
Поэтому, проще и эффективнее Писать Сразу Всё Правильно, чтобы дебаг не был нужен : )
Anonymous
Если у луа такая привередливая вм то проще взять отлаженные биндинги
Vasiliy
ну в moai все коллбеки по дефолту обернуты в pcall
Vasiliy
наверное даже в xpcall, если быть точнее
Snusmumriken
Насколько часто они вызываются?
Vasiliy
видимых просадок не было, в наших играх по крайней мере. Луа вм занимал менее 5% в профайлере. Ванильный 5.1
Snusmumriken
Потому что в моей стимовой либе есть колбеки, когда сишка проверяет наличие луа-функции и вызывает её при определенных обстоятельствах, но это происходит очень редко, и там никаких pcall: если луа упадёт - пускай падает. Если пользователь библиотеки так хочет обезопасить вызов - пускай сам оборачивает внутрянку.
Snusmumriken
Благо падает оно с правильной ошибкой и нормальным стактрейсом.
Snusmumriken
Ну там типа биндинг луа функции, которая из сишки вызывает луа-колбеки.
Snusmumriken
Стактрейс вида: 'вызов функции которая дёргает колбеки -> конкретный колбек -> строка этого колбека'.
Vasiliy
Вызываюстя так часто, как сам захочешь )
Скрытых коллбеков нет, пока сам их не поставишь. Инпут 1 раз за кадр.
Snusmumriken
А почему колбек а не выгрузка в луа списка событий?
Vasiliy
оборачивать в pcall или оставить обычный call конфигурится в рантайме из Луа
Snusmumriken
Ну, типа луа такая: 'а дай мне список событий за предыдущий кадр', а сишка такая: 'а держи'. Никаких колбеков.
Vasiliy
да
Snusmumriken
Вот тут не нужно никаких pcall.
Вызов луа из сишки - очень медленная штука.
Vasiliy
ну там как хочешь. инпут менеджер можно поллить, а можно коллбек поставить
Snusmumriken
Я со стимом так делал по совершенно конкретной причине: там очень, очень много колбековых функций, и под каждую - своя структура с данными. Писать под каждую подкласс события - я задолбался, а вызываются они не каждую секунду даже.
Vasiliy
ага. поллинг круче
Snusmumriken
Ну, вопрос частоты вызовов и степени задалбывания.
Высокая частота - лучше задолбаться. Низкая - можно расслабиться, но если можно без особого траха сделать поллинг - лучше его. Мало ли что ещё добавится.
Я считаю что раз в секунду - низкая, а раз в кадр - уже довольно высокая.
Vasiliy
м? я чет не понял, вроде коллбеки медленные и задалбывают одновременно, поэтому никогда не стоит их использовать )
Vasiliy
на практике, пока О(1) за кадр - то пофиг (тут я имею в виду, что число коллбеков не зависит от кол-ва объектов на сцене)
Snusmumriken
Глянь документацию стима.
https://partner.steamgames.com/doc/api
Тут в каждом модуле - не один десяток колбеков.
Я задолбался делать дерево классов 'Event', в который перегоняются данные всех структур из этих колбеков, с методами выгрузки каждого в луа, и просто прописал вызов соответствующей луа-функции, если она есть и выгрузку в луа у каждого свою. Тоже задалбывает, НО НЕ НАСТОЛЬКО.
Vasiliy
я ж не говорю что ты неправильно делаешь )
иногда без коллбеков никак
Snusmumriken
Нет, первая вариация была на поллинге.
Snusmumriken
Это вполне можно им.
Snusmumriken
Но в три раза муторнее.
Vasiliy
например, я хочу узнать что объект вот-вот обновится и в нем что-то поменяется, типа EVENT_PRE_UPDATE
Vasiliy
чтобы подебажить например, или накостылить говна )
Snusmumriken
Поллинг логов в луа? : )
Snusmumriken
Во, ещё я упоролся на одной вещи.
В этой стимовой штуке, мы при загрузке библиотеки выгружаем в луа таблицу с таблицами с функциями, и запоминаем ссылку на одну из этих таблиц. Колбеки вызываем проверяя, не добавил ли пользователь в эту таблицу соответствующую функцию. Даже если он удалит эту таблицу, она все равно останется, и мы все равно будем её проверять, ничего не упадет. Восхитительно : )
Vasiliy
MOAIScopedLuaState state = MOAILuaRuntime::Get ().State ();
if ( this->PushListener ( SESSION_EXTENDED, state )) {
state.Push ( token );
state.Push ( expDate );
state.DebugCall ( 2, 0 );
}
Vasiliy
все обмазано moai-хелперами, но примерно так вызывается опциональный коллбек с парой параметров
Vasiliy
MOAIScopedLuaState удобная RAII штуковина чтобы top стека не портился
Snusmumriken
Хм. Чтобы топ стека не портился - очищаем стек после вызова каждого колбека.
Snusmumriken
И кстати, тут потенциальные утечки на iBuffer из-за ранних выходов при ошибках, хех.
Пофиксил.
Vasiliy
RAII тащщит
Snusmumriken
Оно умеет автоматически перегонять произвольные сишные структуры в lua-таблицы?
Vasiliy
там оверлоадов и шаблонов гора. То есть, если надо перегнать, то изволь научить MOAILuaState этому
Vasiliy
но 95% коллбеков это ios/android сдкашки типа фейсбука рекламы ин-аппов
Snusmumriken
У меня тож уже оверлоадов гора.
Vasiliy
и objc/java контейнеры сами перегоняются довольно неплохо )
Vasiliy
потому что рефлексия есть
Snusmumriken
Чот такое на оверлоадах, под кучу типов.
Vasiliy
да-да, похожее, только в ООПе.
Snusmumriken
Не только с таблицами, но я выдрал кусок блока отвечающего за "вгоняние в таблицу на вершине стека всякой дряни".
Vasiliy
я писал штуку для экспоза простых структур. чет я забыл правда как
Vasiliy
и умела ли она вложенные
Snusmumriken
У сишных структур можно итерировать по ключам-типам значений?
Vasiliy
нет. там обмазанные макросами объявления полей. метаданные надо сохранять
Vasiliy
примерно как в UE4
Snusmumriken
Потому что вот эта штука - AvatarImageLoaded_t, из которой я вгоняю данные в луа, в начале колбека первого скрина - она объявлена в стиме и приходит уже заполненная данными от стима. Я не знаю как тут можно итерировать по ключам-типам значений, иначе можно было бы половину структур колбеков автоматически перегонять в луа-таблички через набор правил типа "Все int64 перегоняем вот так, а String - вот так".
Snusmumriken
Я далеко не силён в си/плюсах, это типа мой "первый проект длиннее hello world", но это чуть ли не единственный способ который я нашёл: пишем почти всё ручками и не выпендриваемся. Если бы оно было на луях с замечательными динамическими табличками, можно было бы автоматизировать 90% всего.
Мда, чем больше я пишу на С/С++, тем больше я люблю луа и прочую динамику.
Vasiliy
ага. когда получаешь структуру со стороны, то вообще никак кроме как руками
Snusmumriken
Ну, если бы я её сам объявлял - мог бы её описание загнать в отдельное поле хоть строкой.
Vasiliy
мое вот так выглядело https://gist.github.com/Vavius/7914d1424a12abbda2a5152e7440ea9a
Snusmumriken
Ууу, морда
Vasiliy
там была логика на плюсах, а сами компоненты создавались и конфигурились в луа
Vasiliy
плюсы прям часто читают/меняют данные, а луа редко и больше для дебага
Snusmumriken
Видю, ну в общем, более-менее нормальная организация для ваших целей.
Vasiliy
такого объявления было достаточно чтобы в луа писать так:
local move = entity:create("MovementComponent")
move.maximumSpeed = 10
move.targetPosition = {10, -10}
Vasiliy
всякая метатабличная магия )
Vasiliy
наверное очень медленно, но кого это трогает? )
Snusmumriken
Ну, если ты делаешь bullet-hell-шутер без буфера на пару тысяч снарядов - трогает ))
Vasiliy
у нас была стратегия на пару сотен юнитов
Vasiliy
они там сами целятся, куда-то ходют, стреляют, всякое такое
Snusmumriken
Какая-то мелковатая стратегия )))
Ну ладно, если на телефоны - норм.
Vasiliy
там нет скролла )
Vasiliy
скролл неудобно. да, физическое ограничение рамками твоих 4х дюймов
Snusmumriken
Ну, прост я делаю штуки не под какой-то конкретный проект, с рассчётом что "всё может ВНЕЗАПНО стать гораздо хуже".
Жизнь слишком коротка чтобы делать вещи которые нельзя переиспользовать.
Vasiliy
ахахах
Vasiliy
а много получилось переиспользовать? )
Snusmumriken
Ещё как. Я тип знатный велосипедо-либостроитель.
Vasiliy
хз. я много всего написал, но теперь не использую