| メイン |
FF14のエンドコンテンツが何故予習必死といわれるかをプログラム視点で考える。
2015年4月14日 FF14スクエアエニックスとはなんの関係もない一般人が、外部のインタビューなどから内部の事情を勝手に考えるコーナーの第2回。
どこにも需要がないことが、前回ではっきりしたけど、自分の自己満足のために続けてみる。
今回のは、絵で説明したほうがわかりやすいことを、文章で解説してみよう。
手近に書くものがある人は、二本の平行線を引いてS(サーバー)とC(クライアント)と書いて0から15の目盛りを書いておくと分かり易いかも知れない。
さて、例えばタイタンのランドスライドのように回避しないといけない攻撃が発現(地面に赤い線がでる)から1.5秒後に実施されて、回避行動に0.3秒かかるケースを考えて見る。
この時ユーザーが赤い線を見てから回避行動を取るまでにどれだけの猶予があるかを、プログラム的に考えるというのが今回の趣旨です。
え、1.2秒じゃないの?って思った人は、ネットワークゲームのレイテンシー(霊天使と似てるよね)を考えていない。
レイテンシーとは、パケットがネットワークを進んでいく際に発生する時間ロスのことで、ユーザーにはラグに見えるのがこれのことです。
スクエア社内の社内LANでもない限り、国内のどんなにレイテンシーの少ないプロバイダでも100msはある。つまり0.1秒。私の使ってる(安物機材を使用していると思われる)プロバイダーだと300msぐらい。つまり0.3秒。
すると、レイテンシーは行きと帰りの両方に掛かるので、優秀なプロバイダーなら1秒、安物プロバイダーなら0.6秒がファイナルアンサー?
うーん、残念。まだ、考慮してない点があります。
その前に、今までの説明で理解できた人には全く必要のない、今回の記述の方法を述べておきます。
例として、優秀なプロバイダー(レイテンシー100ms=0.1秒)だと
1.タイタンのランドスライドの発現がサーバ時間0でおきます。(これをS0と表記)
2.これが、レイテンシーによって0.1秒遅れてクライアントに届きます。(C1。サーバーの0からクライアントの1へ斜めに線を描く)
3.これを交わすためには、S15にはサーバー上で安全な位置にいないといけない。
4.するとクライアントでは、C14では移動を完了している必要がある。(クライアントの14からサーバーの15へ斜めの線を描く)
5.回避行動には0.3秒掛かると仮定しているので、移動開始はC11に始める必要がある。
6.するとユーザーの猶予時間はC1からC11までの1秒間ということになる。
この説明で理解して頂けただろうか?
では、レイテンシー以外に考慮する点とは何かというと、それはパケットの送出間隔です。
第8回プロデューサーレターライブで、MMOのマジックナンバーとして0.3秒といっているので、FF14もパケットの送出間隔を0.3秒にしているとみていい。(※現在は異なると思われる。理由後述)
つまり、1度パケットを送ったら0.3秒後にならないと再送されないということです。なので、この送出間隔とランドスライド発現のタイミングによっては、上記の例より、さらに悪化することがありえます。つまり、上記の例は、最良の条件だった場合ということになります。
では最悪の条件の場合は、どうなるかというと
1.S0でランドスライド発現。しかし、この直前にクライアントにパケットを送付していた。(そのパケットにはランドスライドの情報なし)
2.S3になってようやく、ランドスライドが発生したことをパケットを通じてクライアントに送信。
3.レイテンシーで0.1秒遅れてC4でユーザーの画面にランドスライドの赤い線が発生。
4.これをよけるためにはS15で移動が完了して安全な位置にいるパケットを受け取ることが必要だが、0.3秒の送出間隔の最悪の場合を考えるとS12の時点で受け取る必要がある。
5.なのでクライアントでの移動完了はC11。移動開始はC8。
6.するとユーザーの猶予時間はC4からC8までの0.4秒ということになる。
さらに、安物プロバイダーのレイテンシーは0.3秒なので、最悪の場合は、C6でランドスライドの赤い線の描画と同時に移動開始しないと死亡。つまり無理ゲー。
まあ、実際には、最良と最悪の間の中間辺りの場合が一番多いので優秀なプロバイダーだと、0.7秒。安物プロバイダーだと0.3秒ぐらいの猶予時間があるということです。
また、時々あたったと思っても大丈夫だったり、大丈夫なはずなのに落ちたりするのは、このパケットの送出間隔のずれに問題があったのです。
FF14のエンドコンテンツがすごく難しいと思っている人は、一度レイテンシーを調べて、どのくらいあるかを確認したほうがいいと思います。
ちなみに私は、レイテンシー0.3秒なので、バハには行ってません。
さて、FF14新生エオルゼアオープン当事は、この実装だったと思いますが、ユーザーからの「避けたのに落ちる」という声に対して、第九回プロデューサーレターライブで表明されているように、調整を入れています。
おそらく、以下のうちひとつもしくは両方の対応を取っています。
A.UDPパケットの送出間隔を0.2秒にした。
B.ランドスライドなどの重大イベントの発生時には、UDPパケットの送出間隔にかかわらず、UDPパケットを強制的に送出するようにした。
いずれの対応もUDPパケットの送出量の増大を意味するので、サーバーとネットワークの負荷状態をみながら対応を行ったと思われます。
では、この対応で十分だったかといえば、残念ながら、そうではない。
結局、何が一番問題かといえば、この地面に書かれた赤い線が出てから回避行動をとるまで何秒の余裕があるか、が、実をいうと全然わからないからだ。
Bの対応を入れることによって、発現時に赤い線が書かれるタイミングのぶれは抑えられる。しかし、いつランドスライドが実施されるかは、相変わらずパケットの送出間隔の間でぶれることになる。Aの対応で0.3秒が0.2秒になろうとも、ぶれが発生することには代わりがなく、同じぎりぎりのタイミングで避けたつもりでも落ちたり、落ちなかったりする。
じゃあ、ユーザーとしてはどうするかというと、あらかじめ次にどんな技がくるのかを予習しておいて、余裕をもって避けようということになる。
開発のバトルチームもこのぶれがあることは、把握しているので、現状エンドコンテンツはランダム性を排除して同じシークエンスで技を繰り出してくるため、予習さえしておけば、次の技が何かはわかる。わかれば、ぎりぎりのタイミングではなく、余裕を持って回避できるのでぶれの影響を排除できる。
結論を書くと、
技の実施タイミングが、パケットの送信間隔によって正確にユーザーが把握できない。
そのために、エンドコンテンツが、そうゆうギリギリで交わす必要がないように、ランダムではなく、決まったシークエンスで技を繰り出す。
そのために、その決まった手順の技を余裕をもって交わすために予習が必要になる。
ユーザーが予習することを前提に、次のコンテンツを作るため技のシークエンスが複雑になり、ますます予習が必須になっていく。
これは、悪循環で、しかも解決策がない。
な・の・で、
いい加減ラグがあることを前提にしたプログラムに変更したほうがいいと思う。
昔WorldOfWarcraftをやっていましたが、おそらくラグを考慮したプログラムになっていたので、間に合わないと思ったヒールが間に合ったことが何度もありました。
それに比べるとFF14新生エオルゼアは、もうあっさりと死ぬ感じ。間に合ってると思っても死んでることが多い。
それはそうだよね。クライアントから見れば、最大で、レイテンシー+パケットの送出間隔の分だけサーバーの時間が進んでいることになる。
つまり、次にやるべき動作は、今この場面ではなく、レイテンシー+パケットの送出間隔の分だけ先の未来での場面を想定する必要がある。もし想定する未来がランダムだとしたら、それを避けれるのは0.何秒とはいえ、未来予知ができる人だけになってしまう。
だから、サーバーから送るパケットにサーバの時間を入れて、クライアントからの応答パケットにも、送ってきたサーバのパケットの時間をいれる。
そうするとサーバ側で、どのクライアントがどれだけ時間が遅れているかわかるので、(このへんなんとなく一般相対性理論っぽいよね)
重大なイベント(死亡するとか、1/2以上のHPを超えるダメージとか)の場合は、その遅れた時間の間だけ、イベントの発生を待ってあげて、その間に応答パケットがくるか待ってあげる、そしてその行動で、回避しているならそれはなかったことにすれば、いいんじゃないだろうか。
これでは駄目ですかね。
どこにも需要がないことが、前回ではっきりしたけど、自分の自己満足のために続けてみる。
今回のは、絵で説明したほうがわかりやすいことを、文章で解説してみよう。
手近に書くものがある人は、二本の平行線を引いてS(サーバー)とC(クライアント)と書いて0から15の目盛りを書いておくと分かり易いかも知れない。
さて、例えばタイタンのランドスライドのように回避しないといけない攻撃が発現(地面に赤い線がでる)から1.5秒後に実施されて、回避行動に0.3秒かかるケースを考えて見る。
この時ユーザーが赤い線を見てから回避行動を取るまでにどれだけの猶予があるかを、プログラム的に考えるというのが今回の趣旨です。
え、1.2秒じゃないの?って思った人は、ネットワークゲームのレイテンシー(霊天使と似てるよね)を考えていない。
レイテンシーとは、パケットがネットワークを進んでいく際に発生する時間ロスのことで、ユーザーにはラグに見えるのがこれのことです。
スクエア社内の社内LANでもない限り、国内のどんなにレイテンシーの少ないプロバイダでも100msはある。つまり0.1秒。私の使ってる(安物機材を使用していると思われる)プロバイダーだと300msぐらい。つまり0.3秒。
すると、レイテンシーは行きと帰りの両方に掛かるので、優秀なプロバイダーなら1秒、安物プロバイダーなら0.6秒がファイナルアンサー?
うーん、残念。まだ、考慮してない点があります。
その前に、今までの説明で理解できた人には全く必要のない、今回の記述の方法を述べておきます。
例として、優秀なプロバイダー(レイテンシー100ms=0.1秒)だと
1.タイタンのランドスライドの発現がサーバ時間0でおきます。(これをS0と表記)
2.これが、レイテンシーによって0.1秒遅れてクライアントに届きます。(C1。サーバーの0からクライアントの1へ斜めに線を描く)
3.これを交わすためには、S15にはサーバー上で安全な位置にいないといけない。
4.するとクライアントでは、C14では移動を完了している必要がある。(クライアントの14からサーバーの15へ斜めの線を描く)
5.回避行動には0.3秒掛かると仮定しているので、移動開始はC11に始める必要がある。
6.するとユーザーの猶予時間はC1からC11までの1秒間ということになる。
この説明で理解して頂けただろうか?
では、レイテンシー以外に考慮する点とは何かというと、それはパケットの送出間隔です。
第8回プロデューサーレターライブで、MMOのマジックナンバーとして0.3秒といっているので、FF14もパケットの送出間隔を0.3秒にしているとみていい。(※現在は異なると思われる。理由後述)
つまり、1度パケットを送ったら0.3秒後にならないと再送されないということです。なので、この送出間隔とランドスライド発現のタイミングによっては、上記の例より、さらに悪化することがありえます。つまり、上記の例は、最良の条件だった場合ということになります。
では最悪の条件の場合は、どうなるかというと
1.S0でランドスライド発現。しかし、この直前にクライアントにパケットを送付していた。(そのパケットにはランドスライドの情報なし)
2.S3になってようやく、ランドスライドが発生したことをパケットを通じてクライアントに送信。
3.レイテンシーで0.1秒遅れてC4でユーザーの画面にランドスライドの赤い線が発生。
4.これをよけるためにはS15で移動が完了して安全な位置にいるパケットを受け取ることが必要だが、0.3秒の送出間隔の最悪の場合を考えるとS12の時点で受け取る必要がある。
5.なのでクライアントでの移動完了はC11。移動開始はC8。
6.するとユーザーの猶予時間はC4からC8までの0.4秒ということになる。
さらに、安物プロバイダーのレイテンシーは0.3秒なので、最悪の場合は、C6でランドスライドの赤い線の描画と同時に移動開始しないと死亡。つまり無理ゲー。
まあ、実際には、最良と最悪の間の中間辺りの場合が一番多いので優秀なプロバイダーだと、0.7秒。安物プロバイダーだと0.3秒ぐらいの猶予時間があるということです。
また、時々あたったと思っても大丈夫だったり、大丈夫なはずなのに落ちたりするのは、このパケットの送出間隔のずれに問題があったのです。
FF14のエンドコンテンツがすごく難しいと思っている人は、一度レイテンシーを調べて、どのくらいあるかを確認したほうがいいと思います。
ちなみに私は、レイテンシー0.3秒なので、バハには行ってません。
さて、FF14新生エオルゼアオープン当事は、この実装だったと思いますが、ユーザーからの「避けたのに落ちる」という声に対して、第九回プロデューサーレターライブで表明されているように、調整を入れています。
おそらく、以下のうちひとつもしくは両方の対応を取っています。
A.UDPパケットの送出間隔を0.2秒にした。
B.ランドスライドなどの重大イベントの発生時には、UDPパケットの送出間隔にかかわらず、UDPパケットを強制的に送出するようにした。
いずれの対応もUDPパケットの送出量の増大を意味するので、サーバーとネットワークの負荷状態をみながら対応を行ったと思われます。
では、この対応で十分だったかといえば、残念ながら、そうではない。
結局、何が一番問題かといえば、この地面に書かれた赤い線が出てから回避行動をとるまで何秒の余裕があるか、が、実をいうと全然わからないからだ。
Bの対応を入れることによって、発現時に赤い線が書かれるタイミングのぶれは抑えられる。しかし、いつランドスライドが実施されるかは、相変わらずパケットの送出間隔の間でぶれることになる。Aの対応で0.3秒が0.2秒になろうとも、ぶれが発生することには代わりがなく、同じぎりぎりのタイミングで避けたつもりでも落ちたり、落ちなかったりする。
じゃあ、ユーザーとしてはどうするかというと、あらかじめ次にどんな技がくるのかを予習しておいて、余裕をもって避けようということになる。
開発のバトルチームもこのぶれがあることは、把握しているので、現状エンドコンテンツはランダム性を排除して同じシークエンスで技を繰り出してくるため、予習さえしておけば、次の技が何かはわかる。わかれば、ぎりぎりのタイミングではなく、余裕を持って回避できるのでぶれの影響を排除できる。
結論を書くと、
技の実施タイミングが、パケットの送信間隔によって正確にユーザーが把握できない。
そのために、エンドコンテンツが、そうゆうギリギリで交わす必要がないように、ランダムではなく、決まったシークエンスで技を繰り出す。
そのために、その決まった手順の技を余裕をもって交わすために予習が必要になる。
ユーザーが予習することを前提に、次のコンテンツを作るため技のシークエンスが複雑になり、ますます予習が必須になっていく。
これは、悪循環で、しかも解決策がない。
な・の・で、
いい加減ラグがあることを前提にしたプログラムに変更したほうがいいと思う。
昔WorldOfWarcraftをやっていましたが、おそらくラグを考慮したプログラムになっていたので、間に合わないと思ったヒールが間に合ったことが何度もありました。
それに比べるとFF14新生エオルゼアは、もうあっさりと死ぬ感じ。間に合ってると思っても死んでることが多い。
それはそうだよね。クライアントから見れば、最大で、レイテンシー+パケットの送出間隔の分だけサーバーの時間が進んでいることになる。
つまり、次にやるべき動作は、今この場面ではなく、レイテンシー+パケットの送出間隔の分だけ先の未来での場面を想定する必要がある。もし想定する未来がランダムだとしたら、それを避けれるのは0.何秒とはいえ、未来予知ができる人だけになってしまう。
だから、サーバーから送るパケットにサーバの時間を入れて、クライアントからの応答パケットにも、送ってきたサーバのパケットの時間をいれる。
そうするとサーバ側で、どのクライアントがどれだけ時間が遅れているかわかるので、(このへんなんとなく一般相対性理論っぽいよね)
重大なイベント(死亡するとか、1/2以上のHPを超えるダメージとか)の場合は、その遅れた時間の間だけ、イベントの発生を待ってあげて、その間に応答パケットがくるか待ってあげる、そしてその行動で、回避しているならそれはなかったことにすれば、いいんじゃないだろうか。
これでは駄目ですかね。
| メイン |
コメント