☰
Path of Building PoE2 伤害计算原理深度解析:DPS 精确计算完整指南
2026/10/23 4:13:45 网站建设 项目流程

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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询