Контекст
Продолжение работы из #3106. После оптимизации affect_total (PR #3118, #3130) узкое место сместилось в Damage::Process.
Текущие данные профайлера (порог 3ms)
Статистика по 17749 строкам профайлера:
Сводка по scope
| Scope |
Count |
Avg ms |
Max ms |
| hit |
332 |
8.36 |
20.43 |
| ProcessDeath |
843 |
2.75 |
11.30 |
| ProcessExtrahits |
214 |
9.74 |
20.77 |
| Damage::Process |
418 |
4.56 |
12.38 |
| PlayerAttack |
240 |
6.91 |
13.76 |
| raw_kill |
591 |
2.14 |
9.89 |
Топ шагов по максимальному времени
| Шаг |
Count |
Avg ms |
Max ms |
| hit/breath_attack |
332 |
3.37 |
20.39 |
| Damage::Process/DeathCheck |
418 |
3.75 |
11.38 |
| ProcessDeath/die |
843 |
2.01 |
10.38 |
| raw_kill/DeathTrigger |
591 |
1.99 |
9.59 |
| ProcessDeath/GroupGain |
843 |
0.69 |
5.27 |
| PlayerAttack/cast_spell |
240 |
1.24 |
9.80 |
Анализ
breath_attack avg 3.37ms — AOE дыхание (мобы с kAreaAttack + breath flag) вызывает CastDamage на каждого врага в комнате. 10 целей × ~0.3ms = 3ms. Нормальная стоимость AOE.
DeathCheck avg 3.75ms — цепочка ProcessDeath → die → raw_kill:
death_mtrigger (DG скрипт при смерти) — выполняется синхронно через script_driver
GroupGain — расчёт опыта группы, avg 0.69ms
real_kill — создание трупа, дроп лута
Спайки до 20ms — не алгоритмическая проблема, вероятно OS scheduling / cache miss / аллокатор.
Что уже сделано
Что можно ещё оптимизировать
Контекст
Продолжение работы из #3106. После оптимизации affect_total (PR #3118, #3130) узкое место сместилось в
Damage::Process.Текущие данные профайлера (порог 3ms)
Статистика по 17749 строкам профайлера:
Сводка по scope
Топ шагов по максимальному времени
Анализ
breath_attack avg 3.37ms — AOE дыхание (мобы с kAreaAttack + breath flag) вызывает CastDamage на каждого врага в комнате. 10 целей × ~0.3ms = 3ms. Нормальная стоимость AOE.
DeathCheck avg 3.75ms — цепочка ProcessDeath → die → raw_kill:
death_mtrigger(DG скрипт при смерти) — выполняется синхронно через script_driverGroupGain— расчёт опыта группы, avg 0.69msreal_kill— создание трупа, дроп лутаСпайки до 20ms — не алгоритмическая проблема, вероятно OS scheduling / cache miss / аллокатор.
Что уже сделано
Что можно ещё оптимизировать
GroupGain— avg 0.69ms, max 5.27ms — расчёт опыта группыdeath_mtrigger— avg 2ms, зависит от конкретного DG скриптаCastDamage— AOE дыхания, N × полный пайплайн уронаImposeAffectвCastDamage(kAcidArrow и др.) — вызывает affect_total при наложении доп. эффектов