perf(point_update): обрабатывать только активных, без скана character_list (#3414)#3417
Open
bylins wants to merge 2 commits into
Open
perf(point_update): обрабатывать только активных, без скана character_list (#3414)#3417bylins wants to merge 2 commits into
bylins wants to merge 2 commits into
Conversation
5ee1165 to
5f645de
Compare
kvirund
reviewed
Jun 6, 2026
Comment on lines
+1537
to
+1547
| // #3414: вместо скана всего character_list -- только активные мобы | ||
| // (их помечает mobile_activity) и все игроки в игре. Снимок указателей, | ||
| // чтобы отложенные extract не ломали обход set'ов между итерациями. | ||
| std::vector<CharData *> to_update; | ||
| to_update.reserve(character_list.active().size() + character_list.players().size()); | ||
| for (auto *m : character_list.active()) { | ||
| to_update.push_back(m); | ||
| } | ||
| for (auto *p : character_list.players()) { | ||
| to_update.push_back(p); | ||
| } |
Collaborator
There was a problem hiding this comment.
Как насчёт отдельной функции? Просто чтобы читалось проще.
Owner
Author
5f645de to
a1eb18e
Compare
…_list (#3414) Пример решения по #3414 (шаг к #3180, без новых глобалов). point_update раньше каждый MUD-час шёл по всему character_list (все мобы мира, десятки тысяч), пропуская не-активных фильтром in_used_zone -- сам скан и давал спайк ~111 мс. Теперь активный набор ведётся в самом реестре Characters (а не новый глобал): - m_active -- мобы, помеченные mobile_activity (одна O(1)-вставка в точке ++processed_mobs), сбрасывается каждый point_update; - m_players -- все игроки в игре (наполняется в push_front, чистится в remove), чтобы поведение PC не изменилось (в т.ч. link-dead). point_update берёт снимок active()+players() и идёт по нему; висячие указатели исключены чисткой в Characters::remove + проверкой purged(). Семантика мобов меняется: регенерируются только активные мобы (для простаивающих безвредно). На валидацию. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
9650138 to
e92a263
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Пример решения по #3414 — на валидацию @kvirund (draft, не для мёржа как есть).
Шаг в сторону #3180: без новых глобалов — активный набор живёт в самом реестре
Characters.Суть
point_updateбольше не сканирует весьcharacter_list(десятки тысяч мобов мира ради пропуска неактивных — это и давало спайк ~111 мс). Вместо этого:Characters::m_active— мобы, которыхmobile_activityуже признал активными. Врезка строго O(1) (mark_active(ch)сразу после++processed_mobs), без новых проходов в и так перегруженном мобакте. Сбрасывается каждыйpoint_update(clear_active).Characters::m_players— все игроки в игре. Наполняется вpush_front(единственная точка входа PC вcharacter_list), чистится вremove. По игрокам идём всегда → поведение PC не меняется, включая link-dead (их не теряем, в отличие от обходаdescriptor_list).point_updateберёт снимокactive()+players()в вектор,clear_active(), затем идёт по снимку. Висячие указатели исключены чисткой вCharacters::remove+ проверкойpurged()на каждой итерации.Открытые вопросы для валидации
m_playersкак владелец PC vs альтернативы (descriptor_list) — устраивает ли такой выбор владельца в духе refactor: уменьшить зависимость от глобального состояния #3180?mobile_activity(отдельная задача — мобакт перегружен).Проверка
Инкрементальная сборка (
ninja -C build) — без ошибок. Замер до/после удобно снять профайлером частей из #3412 (тампросмотренодолжно резко упасть).Связано: #3414, #3180.
🤖 Generated with Claude Code