見出し画像

スプラトゥーンの非同期処理の話 ~なにがラグのせいなのか~

はじめに

こんにちは。スプラ休みが本日で終わりのまけトピアです。
スプラ関連の前作の記事はこちら

さて、みなさんはこういう叫びを聞いたことはありませんか?

「ラグやば!これ絶対当てたのに死なねえんだけど!」
「ラグすぎてワープするんだけど!」
「同期ズレえぐ!!!」

スプラトゥーンは、インターネットを介してゲームの情報をやり取りすることで、離れた人たちとも遊べる対戦アクションゲームです。
まず、大前提として、インターネットを介している時点で、少なからず通信遅延(ラグ)が発生します。ラグのないゲームは存在しません。

スプラトゥーンでは、通信環境が悪くても比較的不快になりにくい実装がされているのですが、これの仕様が結構ややこしくて、自分のプレイのガバさをラグのせいにする人もしばしば見かけます。
(とんでもないラグがあるともちろんキツイですが)

この記事では、

  • 一般的なゲームにおける通信同期方式

  • スプラトゥーンにおいては、どうやって何を同期しているか

  • これはラグのせいなのか、自分のガバのせいなのかのサンプル

を紹介していきたいと思います。
僕は任天堂の中の人ではないので、実機での挙動からの推察になりますが、スプラ1の頃から大枠は変わっていないので、ほとんど嘘は言わないはずです。

一般的なゲームにおける通信方式

オンラインゲームでは、別々のゲーム機の間で盤面の状況(地面の塗り状況やガチエリアのカウントなど)や、各プレイヤーがどういう場所にいるか、といった情報を同期して、「ほぼ同じ世界」を再現する必要があります。
「ほぼ」というのが重要で、大抵のオンラインゲームでは、各ゲーム機で再現される世界は完全に同一ではありません。(同一であることもあります)

この同期の仕組みは、大きく分けて2パターンあります。

同期処理

キー入力などの情報を、1Fずつ律儀に同期して待つ方式です。
格闘ゲームなどではよく使われている(た)方式です。
すべてのフレームで世界を同期するので、「同期ズレ」という概念がない世界です。
その代償に、通信環境が悪い人がいると、世界がスローモーション(コマ落ち)になったり、通信遅延を緩和するために入力を敢えてディレイするという処理を行っていたりで、操作の快適性が悪いという欠点があります。

スマブラとか、スーパーマリオメーカーのみんバトなどはこれっぽいです。
通信中にゲームがもっさりするなら多分これ。

参考文献: 

非同期処理

操作がもっさりするのがゲームに影響が出過ぎるから、通信同期する頻度をほどほどにして、同期が取れない間はそれっぽい世界を再現する、という方式が非同期処理式です。
マリオカートやApex Legends、スプラトゥーンはこれです。

わざわざ同期を取らずにゲームが進行するので、通信環境によらず、自分のゲーム画面での挙動は快適になります。移動もジャンプも射撃もコントローラーの操作がすぐに反映されます。

一方で、完全な世界の同期を諦めているため、自分のゲーム画面と、他の人のゲーム画面では、細かい状態がズレています。
例えば、自分の画面では壁のウラにいるはずなのに、相手の画面では壁のウラから体がはみ出ていて、攻撃されてしまう・・・といったことは普通に起こりえます。

また、同期が取れない間はどうやってゲームを動かすかというと、それまでのキー入力などの情報を使って、次のフレームの操作を予測して動かすということをやっています。

「さっきまで右に進んでたから、次も右に進み続けるやろ!」

ということですね。
大抵の場合はこれで問題ないのですが、崖際や移動する地形(ガチヤグラの上)などで予測が外れると、

「崖から飛び出したはずなのにワープして崖上に戻った」

みたいな現象が起きます。

スプラトゥーン2の初期で騒がれた Tick Rate (チックレート) というのは、この程々に「同期をとるときの間隔」のことで、高ければ「世界のズレ」の幅が小さくなりますが、通信量が増え、要求する通信品質が高くなります。
要求する通信品質が高くなるとどうなるか、というと、回線が弱いお家の場合、せっかくスプラトゥーンを買ってきたのに、「あなたの家は回線が弱いので遊べません」と弾かれることになります。
ガチ勢的には嬉しい世界かもしれませんが、せっかくスプラトゥーンを手に取ってくれた人が遊べないというのは、トータルで見ると嬉しい世界ではない、かもしれません。

参考文献:

スプラトゥーンにおいては、どうやって何を同期しているか

さて、スプラトゥーンが非同期処理でゲームが動いていることを説明しました。
スプラトゥーンで特徴的な同期の取り方について、説明します。

メインウェポンのダメージ判定

シューターやローラーといったメインウェポンで弾を当て、相手にダメージを与える行為にも、当然通信が絡みます。
これは「メインウェポンを撃っている攻撃側の判定」が採用されます。

つまり、

  • 自分の画面で当たっている(ヒット音がしている)なら、正しく当たったことになる

  • 相手の画面で当たっていないように見えても、それは無関係

ということです。
これは当然のことで、自分の画面でヒット音もして、当たっているように見えるのにダメージ判定が出なかったら理不尽だからですね。

壁ウラにいるのに弾当たられたんだけど???

というのは、「相手の画面では当たっている」ということにほかならないということです。

これのスーパー極端な例がこちらのツイートの動画の例です。(勝手ながら引用させていただきます)

攻撃側視点(リッター)では攻撃を当てたので、防御側(バレル)視点では絶対に攻撃が当たらない位置にいたつもりでも、キルが発生するのがわかります。
これは、当然ですがシューター vs シューターなどの近距離インファイトでも、ラグの大小はあれど発生しているものです。

通信の速さはどうあがいても光の速さを超えられないので、ラグがなくなることはありません。ラグが大きいか、小さいかの違いがあるだけです。

あまり関係のない補足ですが、3になって登場した
「弾が出なくなるバグ」(正確には、自分の撃った弾が自分の体に当たって消えてしまうバグ)
によって、メインウェポンの塗り判定も、攻撃側のものが採用されることがわかりました。

サブウェポンのダメージ判定

即死ダメージが発生するサブウェポン、具体的には

  • スプラッシュボム

  • キューバンボム

  • カーリングボム

などは、逆に投げられた側(防御側)の判定が採用されます。

つまり、

  • 投げた本人側では、当たってないように見えるボムで、キルが発生する

    • 投げられた側では、しっかりボムを踏んでいる

  • 投げた本人側では、当たっているように見えるボムで、キルが発生しない

    • 投げられた側では、ボムを踏んでいない

ということが起きます。

これは、ボムは即死ダメージが発生することと、ボムは認識できていれば簡単に避けられるという仕様が関係していると思われます。
ゲーム機間でボムの座標がズレてしまった場合に、投げた側を攻撃判定に採用すると、投げられた側が何が起こったのかわからず、理不尽度が高くなります。
もちろん、歴戦のわかばシューター使いなんかはボムを狙って踏ませたりすることはあるんですが、基本的には「ボムは避けるもの・位置を動かすもの」として想定されていると思います。

サブウェポンは挙動がシンプルで、投げた瞬間にその後の挙動がほぼ確定するという特徴があります。
おそらくボムに関しては初期位置と投射角ぐらいしか同期されていなさそうです。
なので、ボムの位置がワープすることはおそらくないです。
(途中の軌跡をゲーム機間で一致させてない)

ただし、ガチヤグラなどの移動する地形、シェルターのパージなどのプレイヤー操作の介入などによって、ゲーム機間で着弾点はズレることがあります。
このパターンは、たま~に見ることがありますが、「稀によくある」ぐらいの頻度なので、経験的にはほとんど気にする必要はありません。

誰かがボムを投げた後、なにもないところに突然塗りが発生したという経験はないでしょうか?
多分それはボムの着弾位置が自分のゲーム画面と、投げた本人のゲーム画面でズレてしまったのが原因です。

キル判定

さて、メインウェポンで与えたダメージが100を超えて、倒すことができたとします。
このときに、倒された側のゲーム機に、「お前はもう死んでいる」と伝えてあげて、イカちゃんを爆発四散させ、あらゆる行動をできないようにする必要があります。
この処理にも、もちろん通信が必要になります。

キルが受理されるまでの流れ

敵のイカに100ダメージを与えた時点で、自分のゲーム機ではイカちゃんは爆散します。
相手のゲーム機に死んだことを伝えて、その返答が帰ってきた時点で、「○○を倒した!」のキルログ表示が出る、という流れになっています。

やたらとキルログ表示が遅い人を見たことはありませんか?
キルログ表示が遅いのは、この「お前はもう死んでいる」という通信に時間がかかっているということであり、端的に言うとラグい人はこうなります。

先程はシンプルに、片方が一方的に相手を倒す場合を図解しました。
では、お互いにダメージを与えあった場合はどうなるでしょう?

お互いにダメージを与えあった場合

①の時点で、オレンジがブルーのプレイヤーを倒しています。
しかし、「お前はもう死んでいる」という通知が来る前に、②のタイミングでブルーがオレンジを倒しました。
この場合でも、オレンジ・ブルー両方の「攻撃をちゃんと当てた」という事実が採用されるので、オレンジが先にブルーを倒しているにもかかわらず、「相打ち」という結果になります。

これはもちろん、通信遅延が十分小さければ気になりません。
しかし、遅延が大きくなればなるほど、後から攻撃したプレイヤーが相打ちに持っていきやすくなります。
ラグいゾンビクアッドが凶悪なのはこれが理由です。

スプラトゥーン3になって

スプラトゥーン3は、2に比べて、「敵に100ダメージを与えてから、キルログが出るまで」の時間が長くなっているので、これがだいたいのプレイヤーが「3になってからラグくなった」と感じる要因だとおもいます。
少なくとも、筆者の体感でも相当遅くなっているように感じています。

「全体的に通信遅延が増えている」という仮定をすると、攻撃判定が広め・確定数少なめのブキが相対的に強くなります。
具体的にはスクリュースロッシャー・ロングブラスターなどがあたります。

  • あらゆるプレイヤーは、現実の同時刻の位置より、少し前の世界での位置に対して攻撃している

  • 1発目を当てられてから回避行動に動き出しても、その動き出した位置情報が相手に伝わる前に、2発目を当てられてしまい、キルが成立してしまう。

というのが大きな理由です。

1発目をもらってから頑張って逃げるけど手遅れの図

ダメージをもらったことを認識して、逃げはじめる時点②がありますが、
①の時点で死の運命は決まっているので、何もできずにやられる・・・
という感じですね。

よく

そのロンブラの爆風絶対当たってないやん!!

という位置でやられてしまうことはありませんか?
繰り返しになりますが、これも「相手プレイヤーのゲーム機では確かに当たっている」ためです。
確定数が2~3発で済み、崖上などの比較的安全な場所に対して奇襲し易いブキでこの現象に遭遇しがちなのだと思います。

ラグ関係FAQ

メインウェポンを確定数当ててるのに死なねえんだけど!

いいえ、あなたの弾で100ダメージ出てません。当たってません。
メインウェポンのダメージは攻撃側が採用されるので、当てているならキルは発生します。
ただし、ラグによって、少々余裕を持って先制しても相打ちに持っていかれてしまうことはありえます。

このタイプの発言は、自分が弾を当てられなかったことの言い訳をラグに押し付けているんだなあ・・・と思われるので気をつけたほうが良いです。

ボムラグい!見えないボム踏んだんだけど!

いいえ、あなたは確かにボムを踏みました。
ボムの判定は防御側を採用するので、ボムは確かにあなたのすぐそばにありました。

曲がり角の奥とか、カメラに映ってない場所とか、そういうわかりづらいところにあったんじゃないでしょうか。

このタイプの発言は、自分がボムを認識できなかったことをラグのせいに以下略

ヤグラの柱の後ろにいたのにリッターに抜かれたんだけど!

残念ながら、リッター視点では、体が出ているように見えたから抜かれました。柱を貫通しているわけではないです。
通信遅延で体が見えているタイミングがズレたか、同期ズレが発生してプレイヤーの座標が実際にいる場所とズレてしまったかのどちらかです。
対策は難しいですが、崖際・移動する物体・壁からの飛び出し・小さい段差などはゲームが行っているプレイヤー位置の予測がズレやすいので気をつけると良いかもしれません。

イカちゃんの当たり判定(くらい判定)が大きくなった

これは勘違いです。自分は検証してないので、正しくは誰かが検証するべきですが、べつに大きくなってないし、イカちゃんはデブになってません。

先ほど解説した、スプラ3からの全体的な通信遅延増加によって、そうなったと勘違いしやすい、というものです。
相手視点では自分が少し前にいた位置に判定が残っていて…というものですね

ボムの爆風+メインで100ダメ入っているはずなのに、入ってないんだけど!

サブウェポンの位置がズレてしまったか、メインが当たっていません。

ボム踏んだ見た目なのに生きてるんだけど!

ボムは防御側判定が採用されるので、ボムの位置がズレてしまった可能性が高そうです。

なんか敵がワープしたんだけど!

プレイヤーに「同期ズレ」とよく呼ばれる症状です。
定期的なゲーム状態の同期のタイミングで、なんらかの理由で同期がとれない状態が続いた後に、同期が成功するとこういうことが発生することがあります。
通信環境があまりよくないプレイヤーが起こしがちな現象ですが、ホストの通信環境が突然悪くなったりしても起きます。

これに関しては、「原理的にどうしても起きてしまうもの」として受け入れるしかありません。
(こちら側でなにか対策できることは特にない)
文句を言ってもしょうがないので、次に気持ちを切り替えたほうが良いです。

なんか敵がこっちのインクの中を泳いでるんだけど!

 極端に遅延が大きいプレイヤーがこの状態になることがあります。
このパターンに限らないですが、遅延がすごく大きいプレイヤーは射程が長めのブキで相手をすると、被害を抑えやすいです。

ラグに関してプレイヤーができること

端的に言えば、「みんなが自分の通信環境を頑張って改善する」しかありません。自分だけじゃなく、「みんなが」なのがミソです。
とはいえ、スプラトゥーン3は3日で300万本以上売り上げる、とても幅広い層のプレイヤーがいるゲームです。

簡単に自分の家の環境を改善できる立場ではない人もたくさんいることでしょう。
(例えば小学生の子供が「家の回線を変えたい!」と親にねだってもなかなか難しいお家が多いんじゃないでしょうか)

プレイヤーの多さ、というのはオンラインゲームにおいてはすごく重要です。
今後のアップデートをどれぐらい継続してもらうか、という指標にもなるし、単純に大会やコミュニティが盛りあがっていることは、今後遊び続けるかどうかに実は関係が深いことです。
しかし、ある程度ガチでバトルを楽しみたい人にとっては、ラグの問題はできれば悩みたくない部分ではあり、

「ガチでやってる人間なんて全体から見れば少数派なんだから、多少のラグくらい受け入れなさいよ」

というのは個人的には現実的ではないと思います。

ただ、多くの環境で試しやすい改善として、「無線接続をやめて、有線接続で遊ぶ」というのがあるので、ガチで遊びたい人に対してはこれを啓蒙していただくというのが、現実的な落とし所なのかと思います。
トッププレイヤーの人や、ストリーマーの人たちが、「できれば有線で遊んでくれ~」と冷静に語りかけていただくのがいいんじゃないでしょうか。
知らんけど。

おわりに

スプラトゥーンの非同期通信について解説しました。

  • メインウェポンの判定は攻撃側

  • ボムの判定は防御側

これだけ覚えて帰ってください。
これを覚えておくと、不可解なことが起きたときに、自分のせいなのか、ラグのせいなのかがわかります。

ラグを言い訳にすると上達できないので、自分に厳しくなっていきましょう。

あと個人的には、スプラ3になって全員ラグくなったのは実際そう感じるなので早くなんとかしてください任天堂さん~という感じではあるのですが、
それよりも「オープンマッチでカスタマイズして続けるが押せない」とかロビー周りのシーケンスがめちゃくちゃ不便な方が優先度高いので、そっちを早めに直してほしいです。

ほな、カイサン!!!

なんか心が動いたら教えてもらえるとうれしいです