【FF14】FPSとGCD

2021年11月12日 ゲーム
まず、色々な人が検証した結果、FF14には、
「GCDが回り終わって次のGCDが回り始める時に、
 GCD回り終わる→次のGCD回り始める ではなく、
 GCD回り終わる→それが描画される→次のGCD回り始める」
という処理がされている事が判明している。

(ここでいう描画は、実際のモニタに描画される事ではなく、
プログラム側の内部処理(=描画指示)の事だが、
いちいち書くと長いのでこの記事では「描画」と表記している。
つまり、fpsもモニタのFPSではなくff14でシステムコンフィグを開いた時に
そのウィンドウの右上に表示されているFPSのことだ。)


具体的な例を出した方が分かりやすいだろう。

例えば、fpsが10fps固定の状態で、GCDが2.45で回す場合を考えてみる。
fps10だと1フレーム描画するために0.1秒かかるので、

0.00秒:スキル使用。GCDが回り始める

2.45秒:内部的にGCDが回り終わる。(まだ次のGCD回転は始まらない)

2.50秒:回り終わりが描画されて、次のGCDの回転が始まる。

こういう事が起こる。


上の例を見たら分かると思うが、
ゲーム内のGCDは2.45なのに、1回転に2.50秒かかってしまっている。


fpsは、高いほどフレームが描画される間隔が短いので、
大きな遅れが発生しにくくなる。

10fpsなら遅れは最大で0.1秒ほど、
100fpsなら、最大で0.01秒ほど、
1000fpsなら、最大で0.001秒、といった感じだ。





「えっ、じゃあ、FPSが高いほどGCD回るのがはやくなるの?」


そんなわけないだろ、と思うかもしれないが、実はそれで正解だ。

https://forum.square-enix.com/ffxiv/threads/368804-Low-frame-rate-increases-recast-time
こちらのフォーラム投稿では、その事が解説されている。
(こんな事が発生してるんだけど不具合じゃないの?という不具合報告。)




ここからは、具体的にどういう遅延が発生するのかを解説していくが、
FPS制限を使用した場合と、FPS制限を使用しない場合で、
少し異なる結果となるので、それぞれ分けて説明する。


・FPS制限を使用する場合

FPSがぴったりその数値になるため、
「FPSとGCDの数値の組み合わせによって遅延が変わる」
という事が起こる。

FPSも固定値、GCDも固定値の場合は、
GCDが1回転するのにかかるフレーム数も固定になり、
その小数点以下のあまり(=遅延)も固定になる。

1GCDが36.95フレームなら、0.05フレーム相当の遅延しか発生しないし、
1GCDが37.05フレームなら、0.95フレーム相当の遅延が発生する、
といった感じで、
組み合わせたGCDとFPS次第で、遅延が大きかったり小さかったりする。


グラボの設定とかでGCDにあわせたfpsに制限してやれば、
遅延を0.001秒とかかなり小さくできるらしい。
制限したfps上限にしっかり張り付いてくれるかどうかとか、
細かい要素が何か色々あるみたいだが、私はあまり詳しくない。



・FPS制限を使用しない場合

FPSが可変の場合、遅延もバラバラになる。

例えば、100FPSだと、1フレーム0.01秒なので、
0.01秒以上の遅延が発生する事はありえない。

なので、遅延は最小0秒~最大0.01秒になるのだが、
遅延がこの範囲内で均等な確率でランダムに発生すると仮定すると、
平均で0.005秒の遅延が発生すると考えられる。

(FPSが変動するので、GCDの回転が終わったタイミングが
描画されるフレームとフレームの間のどこに来るかは
範囲内で均等な確率でランダムになるはずだ、という仮定だ。)


この理論で計算すると、平均遅延は以下のようになる。

60fps: 0.00833秒
90fps: 0.00556秒
120fps:0.00417秒
150fps:0.00333秒
180fps:0.00278秒
|
270fps:0.00185秒



これが実際に正しいのか実験してみた。

実験方法は、
木人を200GCDほど叩いて、何GCDで何秒かかったのかを計測する、
という事を2.50~2.45の各GCDでそれぞれ実験した。

結果

FPS 90(85~95)(私のPCで人の多い所で実験)
gcd 2.50 :0.00565
gcd 2.49 :0.00555
gcd 2.48 :0.00535
gcd 2.47 :0.00607
gcd 2.46 :0.00585
gcd 2.45 :0.00575 平均 0.00570 (理論値は0.00556)

FPS 120(115~125)(私のPCで人の少ない所で実験)
gcd 2.50 :0.00406
gcd 2.49 :0.00413
gcd 2.48 :0.00428
gcd 2.47 :0.00414
gcd 2.46 :0.00420
gcd 2.45 :0.00415 平均 0.00416 (理論値は0.00417)

これを見る限りはだいたい理論通りの遅延が発生していることになる。

また、上で紹介している海外の方のデータでも
140~170fpsでだいたい0.00300ぐらいの遅延が発生している。
理論値は150fpsで0.00333なので、かなり近い数値だ。

他にも、私が昔、絶コンテンツをやった時に
「綺麗に入力してても、なぜか僅かに遅延があるな」
という事があったのだが、その時の遅延(ログから計算)も、
この理論での数値とだいたい同じ数値だった。


よって、
上の理論で出した数値は、だいたい正しいと考えられる。




5分間(=120gcd)でどのぐらいの遅延が発生するのかを見てみる。

60fps: 0.00833 → 5分で0.9996秒
90fps: 0.00556 → 5分で0.6672秒
120fps:0.00417 → 5分で0.5004秒
150fps:0.00333 → 5分で0.3996秒
180fps:0.00278 → 5分で0.3336秒
|
270fps:0.00185 → 5分で0.2220秒

これは1gcd2.5秒で計算しているので、
gcdの回転が多い忍者とかだともっと多く遅延するだろう。
(忍術のカンカン1回ごとにこの遅延が発生していると考えられる。)

5分で1秒程度の遅延というのは、
火力詰めとかやらない人からするとどうでもいいレベルだが、
限界まで火力を出すために
ギミックにあわせて1gcd単位のスキル回し計画して、
ぴったりその通りにスキル回しをする、
という事をやる場合に、
この遅延のせいで回しがズレて問題になったりする。


60fps前後の人は1gcdにつき0.01秒、
100fps前後の人は2gcdにつき0.01秒、
150fps前後の人は3gcdにつき0.01秒
の遅延があると覚えておくと良いだろう。

コメント