Path of Building PoE2 伤害计算原理深度解析:DPS 精确计算完整指南
【免费下载链接】PathOfBuilding-PoE2项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2
Path of Building(PoB)是流放之路 2 的 Build 计算器,核心能力之一是伤害计算:它把装备、技能、天赋树里的全部修饰符聚合成一套确定性的 DPS 管线。读懂src/Modules/下的这套计算逻辑,你就能判断面板数字是怎么来的、换装时哪个乘区先见顶、异常状态伤害为何没进总伤。
原理总览:从修饰符到 DPS 的三层数据流
PoB 的伤害计算是一条单向管线:修饰符聚合 → 伤害管线 → 结果汇总,每一层只消费上一层的产物,不回头改中间状态。
输入层:技能、装备与天赋树的修饰符集合
- 技能组(主动 + 辅助)、装备词缀、天赋节点、珠宝、异界图 Legacy 等来源,最终全部汇入技能级
skillModList与全局modDB - 每个修饰符带三级分类:
BASE(基数,求和)、INC(increased/reduced,相加)、MORE(more/less,连乘) - 敌人侧属性(抗性、血量)走独立的
enemyDB,与玩家侧分开建模
处理层:ModList 聚合与伤害类型管线
- 聚合公式固定:
BASE 求和 → ×(1 + ΣINC/100) → × Π MORE,所有乘区都由此生成 - 伤害类型用位掩码表示(
Physical=0x01 … Elemental=0x0E, Chaos=0x10),每种类型独立走一条管线,互不污染 - 结果落到
actor.output表,一个统计量一个字段,供下游任意模块读取
输出层:单技能分解与 Full DPS 聚合
- 单技能层:
AverageDamage、TotalDPS、各类 DoT、异常状态等 - 全技能层:
calcs.calcFullDPS(src/Modules/Calcs.lua)遍历技能逐一perform,合并combinedDPS、dotDPS、igniteDPS、bleedDPS等子项 - 带输入差分缓存:修饰符未变的技能直接复用上次结果,这是 gem 下拉实时排序能跑快的原因
计算链路逐步拆解:五步算出 TotalDPS
第一步:基础伤害汇总
做什么:把武器伤害、技能基础伤害、附加伤害词缀按类型汇总进output[type.."MinBase"/"MaxBase"]。为什么:min/max 双通道贯穿始终,保证词缀"对最大伤害 +X"这类修饰符有精确作用对象。
第二步:伤害转换
做什么:processDamageConversion汇总DamageConvertTo*类修饰符,超过 100% 时按比例压缩,保证总量守恒:
-- 转换总量封顶 100%,避免超额转化 if total > 100 then totalConv[type] = val * (100 / total) end为什么:转换链按dmgTypeList顺序(Physical → Lightning → Cold → Fire → Chaos)推进,每一跳的产物还能继续参与下一跳转换,链式转换必须靠固定顺序消除歧义。
第三步:命中、速度与有效打击率
做什么:技能速度由基础时间、冷却、动作速度修正共同决定,PoB 按技能形态(攻击 / 施放 / 多重投射物 / 弩炮)套用不同公式;再算命中率,合成有效打击率hitRate = HitChance/100 × Speed × DpsMultiplier。为什么:吸血、On-hits、异常状态施加全都依赖这个频率,先算它才能驱动后续所有"每次打击"类统计。
第四步:平均伤害与总 DPS
做什么:暴击期望折进平均伤害(暴击期望 × 暴击率 + 普通期望 × 非暴击率),再乘命中率与频率:
output.TotalDPS = output.AverageDamage * (globalOutput.HitSpeed or globalOutput.Speed) * output.DpsMultiplier * quantityMultiplier为什么:把"命中、暴击、频率、数量倍率"拆成四个独立因子,任何一项变化都能单独归因,这正是分解面板可读性的来源。
第五步:Culling Strike 与特殊修正
做什么:击杀类修正(Culling Strike、Reservation)单独算出CullMultiplier后统一乘入。为什么:这类修正依赖敌人血量分布,放在聚合末尾可以避免污染单次伤害模型。
进阶机制与边界场景:双持、异常状态与召唤物
双持与区域伤害的边界处理
- 攻击类技能会建
MainHand/OffHand两份独立输出表,攻击走两个 pass、法术走单个 pass - 合成规则按统计量区分:
OR(取高者)、ADD(相加)、AVERAGE(取平均)以及双持专属合成;异常状态堆叠统一取"全部来自某一只手"的口径 - 区域半径由
calcRadius统一计算,支持区域效果 / 半径修饰符与断点机制,投射物速度与多重区域各自独立折算
异常状态与召唤物:独立管道
- 点燃、中毒、流血、蚀血各自独立结算:
TotalDot = 单 tick 伤害 × tick 数 × DpsMultiplier × 数量倍率,并受全局 DoT 上限封顶 - 异常状态按"施加概率 × 潜在伤害"折算,PoB 在
calcFullDPS中为 Ignite / Poison / Bleed / Corrupting Blood / Decay 分桶累加 - 召唤物继承主人侧的召唤物伤害加成修饰符,再乘以每次施法的召唤数量;
MinionDamageAppliesToPlayer这类反向修饰符同样在此处理
穿透、上限与 Culling 机制
- 抗性先按 BASE + INC 叠加,再减去穿透,压入上限内的部分按穿透比例折损
- Culling Strike 按敌人稀有度(Normal / Rare / Unique)套用不同斩杀阈值,最终乘进
CullMultiplier - 这些修正全部作用于最终聚合,不改变单次伤害模型
从原理到实践:把面板数字变成换装决策
当你 DPS 上不去时,先看分解面板的乘区结构
- 找到
AverageHit → TotalDPS的链条里哪个因子最小:基础伤害低而 more 区少,优先堆基础伤害;命中或速度掉到 100% 以下,补命中通常收益最高 - 分解里每一项都标注了来源修饰符,直接对照词缀找瓶颈
当你要比较装备或技能词缀时,按乘区位置估值
- 固定数值直接进基础伤害;more 类与既有 more 连乘,INC 类收益随总量递减
- PoB 的技能下拉已按 Full DPS 实时排序,先让它排,再用分解面板复核差异来源
当异常状态伤害没进总伤时,检查 DoT 分桶
- 点燃 / 中毒 / 流血 / 蚀血各自独立统计,没进主技能 DPS 不代表没算,查
calcFullDPS的dotDPS分桶 - 确认
DotCanStack与数量倍率是否符合预期
验证与调试
打开 Calcs 页签,每个统计量都能展开src/Modules/CalcBreakdown.lua生成的逐步分解,src/Modules/Calcs.lua的infoDump还能把 Mod DB、技能修饰符和输出表直接打到控制台。快速验证法:固定其他条件只改一项,看输出变化是否符合对应乘区的预期比例。做到这一步,你换装、调树时每个数字都能追到源头——下一步,就按分解面板把收益最高的词缀补上。
【免费下载链接】PathOfBuilding-PoE2项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考