Roy
Snusmumriken
Ровно по этой причине используются МОДУЛИ как пространства имён:
-- temp.lua
-- локальное в temp.lua видимо только внутри temp.lua
local M = {}
function M.foo()
print("meow")
end
return M
-- temp_other.lua
local M = {}
function M.foo()
print("bark")
end
return M
-- main.lua
local tmp = require'temp'
local tmpother = require'temp_other'
tmp.foo() -- meow
tmpother.foo() -- bark
Просто файл скрипта который возвращает просто таблицу. В точке require обзовёшь её как хочешь, это твоя точка входа, как питоновые
import something AS sg
— sg = require"something".
Snusmumriken
И объявлять что-то глобальное в модулях — это плохо, потому что загаживает пространство имён, может коллидировать и путать тебя. Делай локальные таблички с функциями и возвращай, реквайрнешь модуль ровно в том месте где тебе надо, используешь функции из конкретного места, а ссылка на него потом соберётся мусорщиком и не будет мешаться.
Roy
Я не могу догнать, как тогда луаджит юзают в геймдеве если там любое обращение к функциям из другого файла - это хеш таблица.
Как не крути, но в хорошей игре очень много вызовов lua происходит и каждый вызов по сути сопровождается дрочью хеш таблиц
Roy
Я читал, что мол для производительности нужно все пихать в один файл
Roy
ну или хотя бы минимизировать этот момент с обращением к нелокальным функциям
Snusmumriken
Snusmumriken
Всё очень просто. Игровая логика как правило не требует дикой производительности.
Дикая производительность в геймдеве требуется для:
1. Перегонки кучи данных на видяху
2. Рендеринга (+отсечения невидимого всякие)
3. Часть матана, если он нужен в данной конкретной игре
Всё остальное обычно не требует.
Roy
Roy
Потому что можем не успеть скормить картинку рендеру
Snusmumriken
Пока мы гоняем сишный код — мы теряем время. Потому что можем не успеть скормить картинку рендеру.
Snusmumriken
Snusmumriken
Смотри, это написано на луа. И это двухмерный фреймворк.
Snusmumriken
Тут где-то 10к объектов, тоже написано на луа, и они крутятся. И это тоже двухмерный фреймворк который не умеет в 3д.
Roy
Ну это же не отменяет того, что хеш таблица дрочиться
Snusmumriken
И в чём проблема?
Roy
Ну при большом объеме кода луашного будет много обращений к хеш таблице для поиска
Snusmumriken
Ну и что?
Roy
Просадку не даст думаешь?
Snusmumriken
Ты не туда воюешь.
Roy
в совокупности
Snusmumriken
Во-первых, в определённых местах никто не мешает делать массивы.
Во-вторых, проблемой становится не хеш таблица, а именно сборщик мусора, если ты переразмечаешь память. Поиск по хешу — гораздо более быстр чем разметка и удаление табличек без необходимости, например, чем грешат куча разработчиков.
Snusmumriken
Snusmumriken
Прежде чем рассуждать, ты сначала попробуй и проверь сам, ручками.
Roy
Понятно, да я тут читал и че то рассуждать начал, мол что любое обращение к луашным функциям из других луа файлов - это обращение к таблице, отсюда и ноги растут
Snusmumriken
Карочи, это не является проблемой.
Roy
Понял, спасибо
Александр
Snusmumriken
Хотя бы из-за этого
https://github.com/LuaLanes/lanes
Или из того как именно ты организуешь своё приложение, игровой фреймворк-то сишный, делаешь что хочешь, хоть многопоточку для луа.
Snusmumriken
Это раз. Два — для большей части игр не требуется больше одного потока. Я серьёзно. Многопоточность в играх это костыли дикие в большинстве случаев.
Я понимаю выделить сеть или звук в отдельный поток, но "так просто" — не нужно, если ты не городишь игру типа симулятора тысячей сложных говн. Таких игр на пальцах можно пересчитать, хотя делать их интересно.
Snusmumriken
Допустим, у нас есть игра Don't Starve. Вся игровая логика, всё поведение сущностей написано на луа в один поток. Почему? Потому что они могут. Игра ли это? Игра.
У нас есть FarCry6. Там игровая логика тоже на луа, и тоже в один поток. Почему? Потому что этого достаточно. Тормозит ли она? Если и да — то уж точно не из-за логики.
Snusmumriken
Так что не трахаем себе и другим мозги и используем наиболее подходящие и комфортные инструменты там, где возможно.
Ameliance
кто-то шарит как хаммерспун заставить пропускать хотки когда не активна ни одна из программ (ни фотошоп ни люстра)?
Snusmumriken
Подозреваю что сделать вотчер на появление активности конкретной программы и стартовать кнопки, отключать кнопки когда активное приложение другое
Ameliance
Snusmumriken
Дёргать appWatcher:start() когда вотчер активного приложения обнаруживает что это иллюстратор, и appWatcher:stop() когда это не иллюстратор?
Ameliance
Snusmumriken
Напиши
local stopAppWatcher -- вот эту штуку
function applicationWatcher(...)
Snusmumriken
Скорее всего оно не нашло функцию потому что она пока не объявлена.
Snusmumriken
Хотя в целом должно работать и так.
Snusmumriken
У тебя hs.alert.show("other") высвечивается? В целом, насколько я вижу скрипт одноразовый, то есть запускается один раз и останавливается тоже один раз. Тебе по хорошему нужно два вотчера: один следит за активным приложением и запускает второй, который биндит кнопки.
Ameliance
Ameliance
А, не, уже не каждый раз
Snusmumriken
Кароч, из того что я прочитал в доке по
https://www.hammerspoon.org/docs/hs.hotkey.html
и
https://www.hammerspoon.org/docs/hs.application.watcher.html
—
Самое эффективное что можно сделать —
local bind = hs.hotkey.bind
local show = hs.alert.show
function bindPhotoshop()
bind({"alt"}, "g", function() show("Photoshop") end)
end
function bindIllustrator()
bind({"alt"}, "g", function() show("Illustrator") end)
end
function appWatcher(appName, eventType)
if eventType == hs.application.watcher.activated then
-- при активации любого приложения - очищаем все бинды
show("Clear binds")
hs.hotkey.deleteAll()
end
if appName:lower():find("illustrator") then
-- если переключились на иллюстратор - биндим его
show("Bind illustrator keys")
bindIllustrator()
end
if eventType:lower():find("photoshop") then
-- переключились на фотошоп - биндим фотошоп
show("Bind photoshop keys")
bindPhotoshop()
end
end
local watcher = hs.application.watcher.new(appWatcher)
watcher:start()
Snusmumriken
Ну ты понял.
Ameliance
Snusmumriken
Да зачем тебе стопать вотчер?
Snusmumriken
У тебя вотчер работает постоянно, и биндит кнопки в зависимости от активируемого приложения, убирая бинды при каждом переключении.
Snusmumriken
Если побаловаться с hotkey-объектами, можно завести пачку объектов-биндов и активировать её при активации конкретного приложения, деактивируя при переключениях, без пересозданий. Но тебе пока проще создавать, наверное.
Snusmumriken
Если hs.hotkey.deleteAll() не удаляет все бинды — будешь баловаться с активацией-деактивацией конкретных.
Я просто не могу ни запустить ни проверить, так как маками не пользуюсь, а это чисто маковская софтина, проверять рабочесть вариантов нужно тебе.
Snusmumriken
Смотри, остановка вотчера не останавливает бинды. Они никак не связаны между собой. Вотчер просто следит за приложениями, бинды просто мапят кнопки.
Ameliance
Ameliance
Snusmumriken
Что ты хочешь сделать ремапом?
Snusmumriken
Перебиндить кнопку? Если да — почему тогда тут нет ПЕРЕбинда, только бинд?
Snusmumriken
Ааа, всё, понял
Ameliance
Так это и есть бинд
Ameliance
просто сократил, показал что бы потом был понятен контекст
Snusmumriken
Snusmumriken
Что выдаёт после нескольких переключений между фотошопом и иллюстратором и нажатии alt + g?
Snusmumriken
Не заставляй меня вытягивать из тебя инфу клещами, пожалуйста.
Ameliance
Ameliance
Snusmumriken
У тебя тут не очищаются бинды при изменении приложения. Они остаются. Ты переключаешься на иллюстратор и у тебя записываются бинды. Ты переключаешься на фотошоп и у тебя не очищаются бинды иллюстратора.
Ameliance
Ameliance
Ameliance
Snusmumriken
Ты их так не очистишь.
Ameliance
Просто если я на Альт+А назначил что-то в люстре, то потом они не работают как нужно в фигме
Snusmumriken
Правильно, потому что ты их не очищаешь )
Snusmumriken
Понимаешь что тут происходит?
Mikhail
Ахах. Ахах. Все тут по прежнему. И люди те же ❤️
Snusmumriken
Ну что, я загуглил софтину для товарища и как она работает, и пытаюсь читать мысли спрашивающего. Всё как обычно.
Mikhail
Ага. На самом деле даже хорошо, что интерес есть.
Roy
Roy
Погоди, ты про фар край от юбисофта?