主题
这页的目标不是教你“怎么平衡数值”,而是帮你看懂:
HNAttribute 的 perf 档到底在压什么、为什么会重、应该先看哪些配置。
一、先记住 perf 档的定位
perf 档不是正式服推荐模板。
它更像一套热点放大器:
- 把属性数量放大
- 把伤害通道数量放大
- 把 Stage 数量和脚本复杂度放大
- 把 DOT / HOT / Buff / Lore / NBT 这些路径一起压起来
所以你看到 perf 档“很重”,通常不是坏事,反而说明它在刻意制造压力。
二、当前 perf 目录主要看哪些文件
1)基础开关
perf/config.yml
这层一般负责:
- debug 级别
- 公式脚本引擎开关
- Lore / NBT / 条件系统总开关
- 用于压测时的全局行为
如果这里把 Groovy 也打开,那么压测就不是只在压 expression,而是在顺手压脚本引擎路径。
2)战斗模型
perf/attributes/*.ymlperf/damage_types/*.ymlperf/stages/*.ymlperf/pipelines/*.yml
这四层是 perf 档的核心:
attributes/*.yml决定有哪些属性、哪些属性声明了channel + channel-roledamage_types/*.yml决定通道显示方式,以及是否给某个通道单独写resist-formulastages/*.yml决定每一步怎么计算pipelines/*.yml决定这些 Stage 按什么顺序执行
3)周期效果
perf/periodic/settings.ymlperf/periodic/*.yml
这部分用来压:
- DOT / HOT
- direct / instance
- 生命周期 hooks
- 周期动作频率
4)Lore / 物品解析
常见会一起出现:
perf/read-patterns.ymlperf/items/*- 大量测试用 Lore / PDC / NBT 样例
这部分主要是把物品解析和条件系统的成本拉高。
三、perf 档为什么会“重”
1)属性数量更多
perf 档通常不只保留基础属性,还会额外塞进很多:
- 主属性
- 战斗属性
- 元素属性
- 批量测试属性
它们不一定都直接参与最终伤害,但会显著抬高:
- 属性注册数量
- Lore 正则匹配次数
- NBT / PDC 键遍历量
- 玩家属性聚合成本
- 脚本绑定上下文体积
2)伤害通道更多
默认配置可能只演示少量通道,但 perf 档会故意扩很多通道,例如:
physicalfireicelightningpoisonholyshadow- 以及其他自定义通道
目的不是平衡,而是放大:
collect_channels的收集成本per_channel的循环次数- 多通道显示与
DamagePart构建成本 - 每个通道上的减伤公式求值成本
3)Stage 更复杂
perf 档通常不会只跑最短链路,而是把多种 Stage 都塞进去,包括:
- boolean 判定
- value 数值计算
- modifier 修正
collect_channelsper_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.ymlperf/attributes/combat.ymlperf/attributes/element.ymlperf/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.ymlperf/attributes/perf-bulk.yml- 相关测试物品样例
场景 2:伤害核心很高
优先怀疑:
- 通道太多
per_channel太重- modifier 阶段太多
- 多个 Stage 都在跑 Groovy
这时先回头看:
perf/attributes/*.ymlperf/damage_types/*.ymlperf/stages/*.ymlperf/pipelines/*.yml
场景 3:Buff Tick 很高
优先怀疑:
- 同时活跃的 DOT / HOT 实例太多
- 周期动作太频繁
- 生命周期钩子太重
这时先回头看:
perf/periodic/settings.ymlperf/periodic/*.yml
八、建议的阅读顺序
如果你想看“为什么这么重”
perf/attributes/*.ymlperf/damage_types/*.ymlperf/stages/*.ymlperf/pipelines/*.ymlperf/periodic/*.yml
如果你想看“为什么伤害核心慢”
perf/pipelines/*.ymlperf/stages/*.ymlperf/damage_types/*.ymlperf/attributes/*.yml
如果你只想压 Lore / NBT
重点保留:
perf/read-patterns.yml- 大量测试物品
perf/attributes/perf-bulk.yml
如果你只想压伤害核心
重点保留:
perf/attributes/combat.ymlperf/attributes/element.ymlperf/damage_types/*.ymlperf/stages/*.ymlperf/pipelines/*.yml
如果你只想压 DOT / HOT / 周期实例
重点保留:
perf/periodic/settings.ymlperf/periodic/*.yml
九、这页最重要的结论
如果你只想记住 5 句,就记这 5 句:
- perf 不是平衡模板,而是热点放大器。
- 当前版本的通道归属在属性里的
channel + channel-role,不在 DamageType 里绑。 damage_types/*.yml主要管显示和可选resist-formula。- 真正把 perf 成本拉高的,通常是
stages/*.yml+pipelines/*.yml的组合。 - 定位瓶颈时不要只看总耗时,要结合
/hnattr perf stats summary|detail|full一起看。
