Path of Building PoE2 DPS 伤害计算完整指南:从一次暴击闪电到面板数字的完整追踪
【免费下载链接】PathOfBuilding-PoE2项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2
Path of Building(PoB)的 Calcs 面板会直接给你一个 DPS 数字,但很多人只看不懂:它到底是怎么从你身上的武器、词缀、技能宝石算出来的?这篇指南换个思路——不罗列模块,而是跟着一发"会暴击的闪电伤害"走完全程,把 CalcOffence.lua 里的计算顺序、每一步的公式和面板上那些数字的来源一次讲透。读完你会明白:为什么 MORE 比 INC 值钱、为什么暴击流要堆暴击伤害、以及面板 DPS 和"理论值"差在哪。
一次命中要回答的四个问题
PoB 计算某个技能时,本质是在回答四个问题,每个问题对应面板上的一组数字:
| 问题 | 对应输出 | 面板位置 |
|---|---|---|
| 这一下打多少伤害? | 各伤害类型的 min/max/平均 | Damage 栏 |
| 多大概率暴击? | CritChance / CritMultiplier | Crit 栏 |
| 多大概率打中? | HitChance(含命中与格挡) | Hit 栏 |
| 一秒能砸几一下? | HitSpeed(每秒命中数) | Attacks per second 栏 |
DPS 就是这四个数字的乘积(后面细说)。下面的流程严格按照 CalcOffence.lua 中calcs.offence的执行顺序展开。
基础伤害:武器、附加伤害和"基础伤害乘数"怎么合体
计算的第一步发生在所有词缀生效之前。PoB 先算出每种伤害类型(Physical / Lightning / Cold / Fire / Chaos)的基础值,公式是:
baseMin = ((source[typeMin] or 0) + addedMin * addedMult) * baseMultiplier翻译成人话:
- source:武器面板伤害(攻击技能)或技能宝石自身伤害(法术);
- addedMin × addedMult:附加伤害词缀,且会被"X% of Added Damage"这类词缀放大;
- baseMultiplier:技能数据里的 baseMultiplier,比如某些技能的"每颗宝石 +X 伤害"在这里乘进去。
关键细节:附加伤害是"加法进底池"的。你武器 100 物理,附加 200 闪电,你的物理底池还是 100,闪电底池是 200——它们各自独立,后面各自走各自的加成。这也是"附加伤害不吃物理加成、只吃元素加成"这一常见疑问的答案。
转换与获得:两种"借伤害"的机制区别
PoB 用一张 5×5 的转换表(conversionTable)处理所有 Convert 词缀。处理顺序是固定的两步:先处理技能专属转换("This Skill's Physical Damage is Converted to Lightning"),再处理全局转换("Physical Damage is Converted to Lightning"),并且全局转换只作用在"技能转换后剩下的部分"上。如果所有转换加起来超过 100%,会等比压缩回 100%——所以"转 150% 伤害"这种词缀实际只有 100% 生效。
另一种机制是Gain As("获得 X% 物理伤害作为闪电伤害"),它存在独立的gainTable里。两者区别很大:
| Convert(转换) | Gain As(获得) | |
|---|---|---|
| 原伤害是否减少 | 是,按百分比扣走 | 否,原伤害完整保留 |
| 目标伤害吃到目标类型加成 | 能 | 能 |
| 面板表现 | 原伤害变少,新伤害变多 | 原伤害不变,额外多出一块 |
最后,每种伤害类型的"汇总基础值"是三段相加:
summedMin = baseMin * convMult + convertedMin + gainedMin即:自己剩下的底池 + 从别处转进来的 + 从别处获得的。这个数字就是后面所有加成的作用对象。
INC 和 MORE 到底差在哪:先看 PoB 怎么取数
这是玩家最常搞混的一层。在 ModList.lua 里,两个词缀走的是完全不同的取数函数:
local inc = 1 + skillModList:Sum("INC", cfg, "Damage", "LightningDamage") / 100 local more = skillModList:More(cfg, "Damage", "LightningDamage")Sum("INC")把所有 increased/reduced求和:+30% 和 +50% 合计 1.8 倍;More()把所有 more/less连乘:+30% more 和 +50% more 合计 1.3 × 1.5 = 1.95 倍。
所以同样是两块词缀,INC 给你 1.8 倍,MORE 给你 1.95 倍。MORE 的边际收益永远不递减,这就是"MORE 比 INC 值钱"的数学根源。
然后每种伤害类型的最终命中前伤害是:
return round(summedMin * inc * more * moreMinDamage + addMin)注意两个容易忽略的点:
- 存在独立的
MinDamage/MaxDamage修正("Min Physical Damage is Increased by X%"),只对区间端点生效; - 这里只处理命中前的伤害。抗性、护甲在下一步才减,所以"按 X 伤害计算护甲"(CalcArmourAsThoughDealing)之类的词缀会在这个阶段介入。
双通道计算:暴击流为什么暴击伤害收益被暴击率摊薄
PoB 对每个技能做两遍完整计算:pass 1是暴击命中(cfg.skillCond["CriticalStrike"] = true),pass 2是普通命中。两遍各自独立走完 INC/MORE 流程,这样"暴击时伤害 +X%"这种只在暴击时生效的词缀天然就能工作。
两遍之后合并成平均命中:
output.AverageHit = totalHitAvg * (1 - CritChance/100) + totalCritAvg * CritChance/100暴击倍率本身也是"加法池 + 乘法池"的结构:(1 + 基础暴击加成% × (1+INC%) × MORE%),默认 150% 是"基础值里已含 +50%"。
还有一个细节值得注意:命中率不满 100% 时,暴击会先过一遍命中判定——PoB 在 effective 模式下把 CritChance 乘上 HitChance 来模拟"暴击 roll 成功后再确认命中"的规则;Bifurcated Crits(两次判定)则按1 - (1-c)²折算。所以低命中堆高暴击时,面板 DPS 的下跌比你直觉里更狠。
减伤链:护甲、穿透、抗性降序怎么一步步砍掉你的伤害
平均命中算出来后,PoB 会模拟"敌人视角"把伤害砍一遍,顺序是:
物理伤害 → 护甲公式
armourReduction = armour / (armour + raw * ArmourRatio) * 100护甲减伤是百分比且随你伤害提高而边际递减——这就是为什么物理流后期堆伤害比堆穿透/碎甲更划算的数学原因(对 CalcDefence.lua 中armourReductionF的封装)。忽略护甲词缀直接把对应部分清零。
元素伤害 → 抗性 + 穿透:先把敌方抗性夹到配置上限(默认 75%),再用max(resist - pen, minPen)得到有效抗性;存在"混沌用最低/最高抗性结算"这类词缀时,PoB 会遍历三种元素抗性取目标值,并按实际生效的元素重新取穿透。
敌人侧加成 → 总乘区
effMult = (1 + takenInc/100) * takenMore * (1 - effectiveResist/100)"受伤增加"(Damage Taken)这类词缀也走同样的 INC/MORE 双池,只不过挂在敌人身上。最终 min/max/平均三个值统一乘以 effMult,得到"敌人实际掉的血"。
面板 DPS 从哪来:速度、多重命中与 DpsMultiplier
减完之后,DPS 的主公式只有一行:
output.TotalDPS = output.AverageDamage * (globalOutput.HitSpeed or globalOutput.Speed) * output.DpsMultiplier * quantityMultiplier拆开看:
- AverageDamage = AverageHit × HitChance/100——打空的那一下只算 0 伤害;命中率本身来自 CalcDefence.lua 的经典公式
1.25 × accuracy / (accuracy + 0.3 × evasion),再乘上 (1 − 格挡率); - HitSpeed:触发类技能(Brand、持续伤害类)是
1 / (HitTime + Cooldown)或1 / max(HitTime, Cooldown);普通攻击受服务器 tick 上限约束(每秒最多若干次命中); - DpsMultiplier:一个专门挂在 "DPS" 上的 MORE 池,双持(Hits with both weapons,+100%)、Barrage 的重复数、机会性重新装填等都往这里乘——这就是为什么有些技能"面板单发伤害"不高,DPS 却翻倍。
异常状态:为什么 Ignite 有 DPS 上限
Ailment(点燃/中毒/冰缓等)走独立管道,但源数据复用前面的结果:PoB 把减伤前的命中平均(StoredHitAvg/StoredCritAvg)存起来作为异常状态的输入。计算时先按"持续挂状态"的叠层期望取一个 roll 均值(叠层越多越偏向区间上限),然后:
ailmentDPS = baseVal * effectMod * rateMod * activeAilments * effMult ailmentDPSCapped = min(ailmentDPSUncapped, DotDpsCap)注意两个点:异常状态按自己的伤害类型(Ignite 按火、Poison 按混沌)过一遍敌人抗性,且存在一个全局的DotDpsCap上限——叠到顶之后,面板上会继续显示 "x% of Maximum ailment DPS" 提示你还差多少才封顶。Combined DPS 则是命中 DPS + 各异常状态 DPS(+ Impale 等)的加总。
用 Breakdown 面板核对每一步
上面讲的每个乘数,PoB 都可以在界面里逐行验证:Calcs 页签的Breakdown视图由 CalcBreakdown.lua 生成,会打出类似这样的链条:
2500 to 4500 (damage from weapon) + 800 to 1200 (added damage) x 1.80 (increased/reduced) x 1.30 (more/less) = 6300 to 8880 (total damage) x 0.833 (effective DPS modifier)每一行都带灰色注释标明来源。建议的核对路径:先确认 (1) 基础伤害里附加伤害是否被乘对,(2) 转换表是否把目标伤害扣减了,(3) effective modifier 是否符合你预期的抗性/穿透/受伤增加。如果某行乘数和你预期不符,往上看它的^8(...)^7注释就能定位是哪个词缀进了哪个池子。项目内也有 docs/calcOffence.md 记录了 pass/output 的机制,适合想改代码的同学深入。
顺着这套逻辑做 Build 的三个判断
理解了流水线,装备取舍就有了依据:
- 堆底池还是堆加成?所有加成都作用于
summedMin,所以底池越大,同样的 INC 值收益越高。后期装备选择时,"+X 伤害"类词缀在数学上等价于把底池放大,优先级取决于你现有加成池的大小——加成池越大,底池越值钱。 - MORE 的兑换率:一块 +X% MORE 的收益是乘法独立于所有其他乘区,而两块 +X% INC 的收益会被池子里已有的 INC 摊薄。粗略经验:当你总 INC 已经很高时,一块小 MORE 经常胜过同数值的两块 INC。
- 暴击流的收益曲线:面板 DPS 对暴击率的依赖是
1 - c + c × multiplier,这意味着暴击率从 50% 提到 70% 的收益,小于从 0% 提到 20% 的收益——暴击率越高,多堆 1 点暴击伤害的相对价值越高,反之亦然。
DPS 不是玄学,它就是一台把"底池 → 转换 → 加成 → 暴击 → 减伤 → 速度"按固定顺序乘一遍的计算器。你现在看 Calcs 面板时,已经能对上每一个数字是从哪一行公式来的了。
【免费下载链接】PathOfBuilding-PoE2项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding-PoE2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考