【FF14】GCD偏移和帧率税的详解与再分析

1 什么是GCD偏移和帧率税
在统计2.48GCD时,我发现游戏内预设GCD与实际GCD存在偏差,如下图所示。

参照国际服Kekona在5.3版本的武僧攻略以及山羊奶巴伐露@延夏在6.0版本的舞者攻略中做出的假设和结论:GCD偏移的原因与帧率税有关,主要来自于GCD与帧率的对齐程度以及服务器相应程度这两方面。
首先是GCD与帧率FPS的对齐程度问题。
在FF14中,因为游戏的底层逻辑原因,GCD是基于帧率FPS的,就算在某一帧我们的GCD的冷却已经结束了,游戏的客户端也需要等到下一帧被渲染才能处理下一个GCD。
以1.95sGCD下的武僧为例,下图是59FPS和61FPS时GCD间隔和FPS之间的对应关系。

可以看到,在59FPS下,我们的1.95GCD会在第115.05帧冷却完毕,而受限于游戏底层逻辑,下一个GCD会在第116帧后才能使用。
多出的0.95帧就会因此对GCD造成0.95/59≈0.016s的延后,而使用61FPS则是在第118.95帧转好,多出的0.05帧对GCD造成0.05/61≈0.0008s的延后,几乎不造成影响。
然而,以0.999帧为例,帧率税的影响随着FPS增加而减少,且在FPS≥60后,最多影响0.017 s,相较于0.04 s微不足道。

其次就是服务器影响程度。
玩家的数据先是上传到服务器,在服务器在检测到玩家的GCD间隔后,为了保证GCD尽量稳定,会按照GCD±0.04s相对应地进行修正。
如果FPS与GCD对不齐,会被认为是服务器过快,因此会频繁的对GCD进行+0.04s的修正,这种修正被认为是坏修正。
反之,如果FPS与GCD对齐很好,那么服务器会认为GCD比实际慢了,因此会频繁进行-0.04s的修正,这种修正被认为是好修正。
好修正会GCD在延迟+帧率税的情况下仍然符合实际的值。理论上来讲只需要用:GCD×FPS=整数,就能获得一个很好的帧率断点。此外,在FPS和GCD不匹配的情况下,会有非常大的可能性达不到应该有的技能速度阈值。以舞者为例,在2.47GCD、60FPS的情况下,受到帧率税的影响,计算下来的实际GCD为2.478s,接近2.48s,相当于技速掉了一档。
然而,如果将FPS锁在断点的话会得到相当多的坏修正,这是因为实际的FPS会在锁帧点上下波动,并且有略低于锁帧点的趋势。以武僧1.95GCD为例,在锁60FPS时,实际FPS略低于60,修正结果接近使用59FPS的情况。而锁在断点的下一帧,即61FPS,能得到相当多的好修正。

2 GCD偏移和帧率税的再分析
然而,在实际的验证中,发现在一些武僧1.95GCD的断点+1值(如:101FPS)并没有出现优于断点的情况,甚至101FPS时的好修正并没有高出太多,甚至101FPS的实际GCD还高于100FPS的实际GCD(受于电脑配置问题,121FPS的情况无法复现)。


我又对赤魔法师2.48GCD进行了测试,发现在其断点+1值(如:51、76、101FPS)上的实际GCD值并不是最小的。

测试得到的赤魔2.48GCD
那么这是否代表前面对于帧率税的结果是错误的?并不完全是FPS对游戏GCD确实有影响,GCD技能确实是在冷却结束的下一帧才能使用。主要的问题在于±0.04s的好坏修正与FPS和GCD的关系。
受于FPS限制,服务器会首先对玩家的实际GCD进行一个计算,会同时参考玩家的FPS和游戏内设置的GCD,所计算的理论GCD值=GCD+因为帧率延后的时间,即:理论GCD=GCD+[1-mod(GCD×FPS,1)]/FPS (mod为取余函数,对GCD*FPS除以1进行取余)。
例如:我在游戏中选用2.48GCD,FPS=101,那么服务器就会假定玩家的理论GCD=2.48+[1-mod(2.48×101,1)]/101=2.48+(1-0.48)/101≈2.485s。
而修正原因是因为GCD偏移到了2.485±0.04s之外,服务器认为需要将GCD修正回2.485s,随后服务器就会对玩家进行好修正和坏修正,也就是说,好修正和坏修正的数量和断点并没有直接关系,好修正多不代表当前FPS最优,而有坏修正也不代表当前FPS最差。好/坏修正则是取决于玩家的实际GCD与理论GCD相比是否偏移过大。
将上述假设带回到实际,可以看到理论GCD与实际GCD非常接近,对于我之前所实测的武僧1.95GCD,相关性85.57%,而对于样本量更大的赤魔法师2.48GCD,相关性有95.89%,可以证明上述假设是较为准确的。




此外,值得注意的是,在断点(50、75、100FPS)上,实际GCD会显著低于理论GCD,具体原因未知,但依旧不是最低的实际GCD,不影响对FPS的择优选择。
基于上述假设,我给出了赤魔法师在2.50-2.47GCD下不同FPS情况的理论GCD,可作为帧率选择参考使用,其它的GCD情况可根据我前面提出的计算方法进行计算,即:理论GCD=GCD+[1-mod(GCD×FPS,1)]/FPS。

3 小结
服务器会根据FPS与游戏内设置的GCD计算理论GCD值,并根据玩家实际GCD与理论GCD的差值进行±0.04s的修正。
服务器所计算的理论GCD值=GCD+因为帧率延后的时间,即:理论GCD=GCD+[1-mod(GCD×FPS,1)]/FPS。