fix: восстановить позицию игрока в рейтинге + pulse-refresh вместо per-kill (#3280)#3281
Merged
Merged
Conversation
#3142 ограничил chart_ до kPlayerChartSize ради перфа на per-kill Refresh. Из-за этого «Перед вами / Ваш текущий рейтинг / После вас» в `do_best <класс>` показывался только для топ-10 — у остальных секции пустые, а позиция игрока не определяется. Возвращаю pre-#3142 состояние `top.cpp` и `top.h`. Дисплей снова работает для всех игроков. Внимание — этот ревёрт также снимает мои последующие правки (top_remort_ как отдельный список для максремортов, dup-check в Refresh, секция «Достигшие максимум» в PrintPlayersChart). Если эти куски нужны — занесу отдельным коммитом поверх. Перфовая идея «пересчитывать chart раз в RL-час вместо per-kill» осталась нереализованной — отдельная задача. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…3280) Per-kill TopPlayer::Refresh(ch) в perform_group_gain (fight_stuff.cpp:778) бил по profiler'у — для группы из K игроков на каждом рипе крутилось K линейных сканов chart_, без ограничения на длину. Именно из-за этого в #3142 ввели kPlayerChartSize=10, что в свою очередь сломало «Перед вами / Ваш текущий рейтинг / После вас» для всех вне топ-10. Теперь, после ревёрта #3142, обновляем chart_ периодически: - убран Refresh из perform_group_gain (и неиспользуемый include top.h) - добавлен TopPlayer::RefreshAll() — обходит character_list (онлайн), пропускной фильтр уже внутри Refresh - новый heartbeat-step «Top player chart refresh» с периодом RL-час (60 * 60 * kPassesPerSec), offset 43 -- не конкурирует с соседними hourly-шагами Логин/level/remort/admin set уже зовут Refresh точечно, периодический проход добивает изменения exp у активных игроков. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
character_list содержит мобов и чармисов помимо онлайн-игроков. Pull из descriptor_list с фильтром state == kPlaying ограничивает обход реально играющими PC и заодно пропускает соединения в меню / character generation. Оффлайн-игроки сохраняют свои записи в chart_ с буткового прохода (ActualizePlayersIndex -> TopPlayer::Refresh) — их состояние не меняется, пока они вне игры, обновлять нечего. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Через utils::CExecutionTimer оборачиваем периодический проход и пишем в SYSLOG строку вида: TopPlayer::RefreshAll: N игроков обновлено за X.XXX мс Чтобы понять, какова реальная стоимость периодического рефреша на живых нагрузках (сейчас зовётся раз в RL-час из heartbeat). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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.
Summary
Два коммита, делают то, что попросили:
1.
revert: откатить TopPlayer к состоянию до #3142—src/gameplay/statistics/top.{cpp,h}к3dccb407b^. Снимает капчуkPlayerChartSize=10, из-за которой «Перед вами / Ваш текущий рейтинг / После вас» вdo_best <класс>работал только для топ-10. Заодно откатываются три моих коммита поверх #3142 (top_remort_отдельный, секция «Достигшие максимум» вPrintPlayersChart, dup-check) — они были починкой проблем, возникших из-за моей капчи, после её снятия не нужны.2.
perf: TopPlayer::Refresh — на pulse раз в RL-час— то, чем заменяем per-kill путь:TopPlayer::Refresh(ch)изperform_group_gain(fight_stuff.cpp:778) + соответствующий includeTopPlayer::RefreshAll()— обходитcharacter_list, фильтр NPC/Frozen/Deleted/Immortal уже внутриRefresh60 * 60 * kPassesPerSec(RL-час), offset 43Refreshвсё ещё точечно зовётся на login (ActualizePlayersIndex), level-up/down и remort (pc_classes.cpp:1121,1158) и admin set (do_set.cpp:652,667) — это покрывает события, которые реально меняют позицию в рейтинге. Периодический проход добивает накопление exp у активных игроков.Closes #3280
Test plan
-Dyaml=builtinсобирается без варнинговmeson test -C build_yaml2→ все тесты зелёныеdo_best <класс>показывает «Перед вами / После вас» для игрока вне топ-10 (после ребута + RL-часа)GroupGainне пишет TopPlayer::Refresh в горячую часть🤖 Generated with Claude Code