Size: a a a

2019 September 27

АК

Александр Караев in pro.lua
collectgarbage() на каждый финал корутины - дороговато
источник

АК

Александр Караев in pro.lua
Я уже сталкивался с проблемой отложенных деструкторов и сначала также её решил :D
источник

S

Snusmumriken in pro.lua
Зато точно не переживёт : )

Пардон, сколько корутин ты плодишь/удаляешь по времени, что collectgarbage тебе дороговато?
источник

АК

Александр Караев in pro.lua
Ну.. много. Сборка мусора занимает около 1мс по моим тестам. В критические моменты может быть до сотни корутин (некоторые без yield, поэтому создаются, выполняются и сразу умирают) в секунду. Сама корутина отрабатывает значительно быстрее, чем сборка мусора после неё (хотя я не замерял, но сделаю)
источник

S

Snusmumriken in pro.lua
А можно это.. Как-то подольше? : )
источник

S

Snusmumriken in pro.lua
Ну там, корутина принимает функцию-таску, исполняет, йелдит. Есть стабильный пул корутин.
источник

АК

Александр Караев in pro.lua
Онлайн игра. Корутины - это события on_mob_death, on_mob_damage и прочие. Иногда on_damage - это просто total_damage = total_damage + damage, иногда сложнее (например, подождать секунду в yield'нутом состоянии и потом как-то отреагировать).
Одного моба могут бить сразу сотня игроков по несколько ударов в секунду
источник

S

Serezha in pro.lua
источник

S

Snusmumriken in pro.lua
Александр Караев
Онлайн игра. Корутины - это события on_mob_death, on_mob_damage и прочие. Иногда on_damage - это просто total_damage = total_damage + damage, иногда сложнее (например, подождать секунду в yield'нутом состоянии и потом как-то отреагировать).
Одного моба могут бить сразу сотня игроков по несколько ударов в секунду
Кажется это точно не стоит запихивать в корутины. Я стараюсь даже таблицы не создавать на подобные штуки, потому что слишком много динамики, разметок и тут же удалений из кучи. Хм.

Может я в чём-то ошибаюсь, но риальне чот много.
источник

АК

Александр Караев in pro.lua
Можно конечно попробовать статичный пул, но нужно иметь возможность одновременной работы тысячи корутин, при этом средняя заполненность будет 1-3
источник

S

Snusmumriken in pro.lua
Александр Караев
Можно конечно попробовать статичный пул, но нужно иметь возможность одновременной работы тысячи корутин, при этом средняя заполненность будет 1-3
Просто саморасширяемый пул. Если тасок немного — по чуть-чуть уменьшаем, если буфер переполняется — досоздаём. Получается гибкая буферная фигня.
источник

АК

Александр Караев in pro.lua
Хорошо, это как вариант решения проблемы. Но вопрос с владением объектов всё равно нужно как-то решить, чтобы я хотя бы понимал, что происходит.
источник

АК

Александр Караев in pro.lua
Кстати таким решением я скорее всего воспользуюсь, спасибо. Скорость никогда не помешает
источник

АК

Александр Караев in pro.lua
Например, что произойдёт, если в корутине будет создана переменная, помещена в глобальную таблицу, поток умрёт и будет сборка мусора?
Всё равно ж ссылка невалидная
источник

S

Snusmumriken in pro.lua
Должно быть ок, потому что она помещена в глобальную таблицу, куча типа общая.
источник

АК

Александр Караев in pro.lua
Так у каждой переменной свой L!
источник

АК

Александр Караев in pro.lua
Ну или может быть
L: S
L1: Q
S[1] = Q; // владелец Q теперь L
источник

АК

Александр Караев in pro.lua
Или как мне заставить все переменные аллоцироваться с владельцем L?
источник

АК

Александр Караев in pro.lua
Можешь подкинуть кусок кода из ядра луа, где происходит аллокация объекта?
источник

S

Snusmumriken in pro.lua
Странное дело, потому что тут я не в курсе.

Если создаётся локальная переменная в корутине — я не знаю кому она принадлежит. Если она создаётся глобальной — она точно создаётся в мейн-стейте.

Мне страшно это искать, потому что надо разбирать луёвый парсер.
источник