Skip to content

fix: восстановить позицию игрока в рейтинге + pulse-refresh вместо per-kill (#3280)#3281

Merged
bylins merged 4 commits into
masterfrom
fix/restore-player-rating-position-3280
May 17, 2026
Merged

fix: восстановить позицию игрока в рейтинге + pulse-refresh вместо per-kill (#3280)#3281
bylins merged 4 commits into
masterfrom
fix/restore-player-rating-position-3280

Conversation

@bylins
Copy link
Copy Markdown
Owner

@bylins bylins commented May 17, 2026

Summary

Два коммита, делают то, что попросили:

1. revert: откатить TopPlayer к состоянию до #3142src/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) + соответствующий include
  • добавлен TopPlayer::RefreshAll() — обходит character_list, фильтр NPC/Frozen/Deleted/Immortal уже внутри Refresh
  • новый heartbeat-step «Top player chart refresh», период 60 * 60 * kPassesPerSec (RL-час), offset 43

Refresh всё ещё точечно зовётся на login (ActualizePlayersIndex), level-up/down и remort (pc_classes.cpp:1121,1158) и admin set (do_set.cpp:652,667) — это покрывает события, которые реально меняют позицию в рейтинге. Периодический проход добивает накопление exp у активных игроков.

Closes #3280

Test plan

  • meson -Dyaml=builtin собирается без варнингов
  • meson test -C build_yaml2 → все тесты зелёные
  • на проде do_best <класс> показывает «Перед вами / После вас» для игрока вне топ-10 (после ребута + RL-часа)
  • profiler GroupGain не пишет TopPlayer::Refresh в горячую часть

🤖 Generated with Claude Code

bylins and others added 2 commits May 17, 2026 11:35
#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>
@bylins bylins changed the title revert: откатить TopPlayer к состоянию до #3142 (#3280) fix: восстановить позицию игрока в рейтинге + pulse-refresh вместо per-kill (#3280) May 17, 2026
bylins and others added 2 commits May 17, 2026 11:56
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>
@bylins bylins merged commit 0d0bdb7 into master May 17, 2026
20 checks passed
@bylins bylins deleted the fix/restore-player-rating-position-3280 branch May 17, 2026 11:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

лучшие

1 participant