Skip to content

perf: Damage::Process профилирование и оптимизация #3142

@bylins

Description

@bylins

Контекст

Продолжение работы из #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 / аллокатор.

Что уже сделано

Что можно ещё оптимизировать

  • GroupGain — avg 0.69ms, max 5.27ms — расчёт опыта группы
  • death_mtrigger — avg 2ms, зависит от конкретного DG скрипта
  • CastDamage — AOE дыхания, N × полный пайплайн урона
  • ImposeAffect в CastDamage (kAcidArrow и др.) — вызывает affect_total при наложении доп. эффектов
  • Dirty flag подход для affect_total (из Отчёт по affect_total #3053) — самая масштабная оптимизация

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions