Skip to content

这页的目标不是教你“怎么平衡数值”,而是帮你看懂:

HNAttribute 的 perf 档到底在压什么、为什么会重、应该先看哪些配置。


一、先记住 perf 档的定位

perf 档不是正式服推荐模板。

它更像一套热点放大器

  • 把属性数量放大
  • 把伤害通道数量放大
  • 把 Stage 数量和脚本复杂度放大
  • 把 DOT / HOT / Buff / Lore / NBT 这些路径一起压起来

所以你看到 perf 档“很重”,通常不是坏事,反而说明它在刻意制造压力。


二、当前 perf 目录主要看哪些文件

1)基础开关

  • perf/config.yml

这层一般负责:

  • debug 级别
  • 公式脚本引擎开关
  • Lore / NBT / 条件系统总开关
  • 用于压测时的全局行为

如果这里把 Groovy 也打开,那么压测就不是只在压 expression,而是在顺手压脚本引擎路径。

2)战斗模型

  • perf/attributes/*.yml
  • perf/damage_types/*.yml
  • perf/stages/*.yml
  • perf/pipelines/*.yml

这四层是 perf 档的核心:

  • attributes/*.yml 决定有哪些属性、哪些属性声明了 channel + channel-role
  • damage_types/*.yml 决定通道显示方式,以及是否给某个通道单独写 resist-formula
  • stages/*.yml 决定每一步怎么计算
  • pipelines/*.yml 决定这些 Stage 按什么顺序执行

3)周期效果

  • perf/periodic/settings.yml
  • perf/periodic/*.yml

这部分用来压:

  • DOT / HOT
  • direct / instance
  • 生命周期 hooks
  • 周期动作频率

4)Lore / 物品解析

常见会一起出现:

  • perf/read-patterns.yml
  • perf/items/*
  • 大量测试用 Lore / PDC / NBT 样例

这部分主要是把物品解析条件系统的成本拉高。


三、perf 档为什么会“重”

1)属性数量更多

perf 档通常不只保留基础属性,还会额外塞进很多:

  • 主属性
  • 战斗属性
  • 元素属性
  • 批量测试属性

它们不一定都直接参与最终伤害,但会显著抬高:

  • 属性注册数量
  • Lore 正则匹配次数
  • NBT / PDC 键遍历量
  • 玩家属性聚合成本
  • 脚本绑定上下文体积

2)伤害通道更多

默认配置可能只演示少量通道,但 perf 档会故意扩很多通道,例如:

  • physical
  • fire
  • ice
  • lightning
  • poison
  • holy
  • shadow
  • 以及其他自定义通道

目的不是平衡,而是放大:

  • collect_channels 的收集成本
  • per_channel 的循环次数
  • 多通道显示与 DamagePart 构建成本
  • 每个通道上的减伤公式求值成本

3)Stage 更复杂

perf 档通常不会只跑最短链路,而是把多种 Stage 都塞进去,包括:

  • boolean 判定
  • value 数值计算
  • modifier 修正
  • collect_channels
  • per_channel
  • 各种条件门控和脚本分支

也就是说,它不只是压“算一个数字”,还在压:

  • 阶段匹配
  • 上下文准备
  • 多阶段传值
  • 脚本解释执行

4)周期效果也会一起参与热路径

如果你同时开着:

  • Buff 调度
  • DOT / HOT 实例
  • 生命周期动作
  • 战斗标记刷新

/hnattr perf stats 里的总耗时会明显更高。


四、当前版本里通道是怎么绑定属性的

这是近期最容易搞混的地方。

当前版本是靠属性自己声明通道归属

yml
attack_damage:
  channel: physical
  channel-role: damage

defense:
  channel: physical
  channel-role: resist

physical_penetration_flat:
  channel: physical
  channel-role: penetration_flat

也就是说:

  • damage 负责提供该通道的伤害来源
  • resist 负责提供该通道的抗性
  • penetration_flat / penetration_rate 负责提供穿透

所以在 perf 档里:

  • 想增加某个通道的参与度,先看 attributes/*.yml
  • 想改这个通道怎么显示、怎么特殊减伤,再看 damage_types/*.yml

五、当前版本里战斗公式分工怎么记

attributes/*.yml

负责声明:

  • 这个属性属于哪个通道
  • 它在通道里扮演什么角色

damage_types/*.yml

负责:

  • 显示名
  • 颜色
  • 显示模板
  • 可选 resist-formula

stages/*.yml

负责:

  • 命中 / 闪避 / 格挡 / 暴击等判定
  • 基础伤害计算
  • 自定义修正逻辑
  • 通道收集
  • 按通道减伤

pipelines/*.yml

负责:

  • 把多个 Stage 编排成一条攻击链路
  • 区分近战 / 远程 / 法术 / DOT 等攻击方式

一句话记忆:

属性声明通道,DamageType 管显示,Stage 管计算,Pipeline 管顺序。


六、perf 档里最值得重点看的几段

1)属性配置

优先看:

  • perf/attributes/base.yml
  • perf/attributes/combat.yml
  • perf/attributes/element.yml
  • perf/attributes/perf-bulk.yml

常见职责:

  • base.yml:基础攻防、生存、速度
  • combat.yml:命中、闪避、暴击、格挡、增伤、减伤等战斗字段
  • element.yml:火、冰、雷、毒等元素/通道属性
  • perf-bulk.yml:纯放大用测试属性

2)DamageType 配置

优先看:

  • perf/damage_types/*.yml

这里重点不是“它绑了什么属性”,而是:

  • 有多少通道
  • 每个通道怎么显示
  • 哪些通道自己带了 resist-formula

如果某个通道没写 resist-formula,通常会回到 stages/resist.yml 的默认通道减伤逻辑。

3)Stage 配置

优先看:

  • perf/stages/*.yml

这里是 perf 档最容易把成本拉高的地方。常见压力来源:

  • boolean 判定多
  • modifier 链长
  • Groovy 分支多
  • per_channel 里每个通道都要跑脚本

4)Pipeline 配置

优先看:

  • perf/pipelines/*.yml

你最该关心的不是文件名,而是:

  • stages 列表里串了多少步
  • 每条攻击方式会不会跑很多自定义 Stage
  • 某个高频攻击是否复用了特别重的 Pipeline

七、怎么判断 perf 到底在压哪一层

场景 1:物品解析很高

优先怀疑:

  • Lore 行太多
  • 正则太复杂
  • 测试属性太多
  • PDC / NBT 读取源太多

这时先回头看:

  • perf/read-patterns.yml
  • perf/attributes/perf-bulk.yml
  • 相关测试物品样例

场景 2:伤害核心很高

优先怀疑:

  • 通道太多
  • per_channel 太重
  • modifier 阶段太多
  • 多个 Stage 都在跑 Groovy

这时先回头看:

  • perf/attributes/*.yml
  • perf/damage_types/*.yml
  • perf/stages/*.yml
  • perf/pipelines/*.yml

场景 3:Buff Tick 很高

优先怀疑:

  • 同时活跃的 DOT / HOT 实例太多
  • 周期动作太频繁
  • 生命周期钩子太重

这时先回头看:

  • perf/periodic/settings.yml
  • perf/periodic/*.yml

八、建议的阅读顺序

如果你想看“为什么这么重”

  1. perf/attributes/*.yml
  2. perf/damage_types/*.yml
  3. perf/stages/*.yml
  4. perf/pipelines/*.yml
  5. perf/periodic/*.yml

如果你想看“为什么伤害核心慢”

  1. perf/pipelines/*.yml
  2. perf/stages/*.yml
  3. perf/damage_types/*.yml
  4. perf/attributes/*.yml

如果你只想压 Lore / NBT

重点保留:

  • perf/read-patterns.yml
  • 大量测试物品
  • perf/attributes/perf-bulk.yml

如果你只想压伤害核心

重点保留:

  • perf/attributes/combat.yml
  • perf/attributes/element.yml
  • perf/damage_types/*.yml
  • perf/stages/*.yml
  • perf/pipelines/*.yml

如果你只想压 DOT / HOT / 周期实例

重点保留:

  • perf/periodic/settings.yml
  • perf/periodic/*.yml

九、这页最重要的结论

如果你只想记住 5 句,就记这 5 句:

  1. perf 不是平衡模板,而是热点放大器。
  2. 当前版本的通道归属在属性里的 channel + channel-role,不在 DamageType 里绑。
  3. damage_types/*.yml 主要管显示和可选 resist-formula
  4. 真正把 perf 成本拉高的,通常是 stages/*.yml + pipelines/*.yml 的组合。
  5. 定位瓶颈时不要只看总耗时,要结合 /hnattr perf stats summary|detail|full 一起看。

十、相关页面

HN 系列插件文档