🌐

ロックマンエグゼで快適なネット対戦ができるようになるかもしれない話

2022/05/05に公開

みなさん、ロックマンエグゼという作品を知っていますか?

ロックマンエグゼは、カプコンから2001年に発売されたゲームボーイアドバンス(以降、GBA)用のゲームソフトで、ポケモンと同様にGBAの人気を支えたゲームです。

ナンバリング作品として、1~6までがGBAで発売されました。2005年に発売した6でストーリーが終了したため続編は発売されていません。

エグゼシリーズの人気コンテンツの1つに通信ケーブルを使った通信対戦機能があります。

現在でもインターネットを介して通信対戦をする人がいるほどです。

https://youtu.be/qoxghBM1RJE

ネット対戦?

実は、GBA本体にインターネットに接続する機能はありません。

最近はスマホやゲーム機がもれなくインターネットと接続して情報をやりとりする時代ですが、GBAが発売されたのは2001年なのでインターネット接続機能はありませんでした。

なので先ほど述べた通信対戦も、2台のGBA同士を有線の通信ケーブルで繋ぐことでGBA同士で情報をやりとりしていました。(ゲームによってはワイヤレスアダプタを使うものもあります)

では一体どうやってロックマンエグゼのインターネット対戦をしているのかというと、答えはエミュレータです。

GBAで通信ケーブルを用いてデータをやり取りする際には、特定のレジスタ(SIODATA)に送信したいデータを書き込んで、制御レジスタ(SIOCNT)でデータ転送をゲームソフトがリクエストすることでデータのやり取りが行われます。基本的にGBAのデータ転送は単方向のものではなくデータ転送リクエストがあった場合に、お互いのGBAがレジスタ(SIODATA)のデータを相手側に同時に送るという双方向のデータ転送になっています。

エミュレータでは、制御レジスタを使ってデータ転送リクエストが行われた際に、相手のエミュレータとインターネット経由でデータをやり取りします。これはまさにOSI参照モデルで下位レイヤのプロトコルを変えるようなものです。

これでインターネット経由で相手のGBAエミュレータとデータのやり取りができるのですが、大きな問題がありました。

ネット対戦の問題点とロックステップ

ネット対戦では、(現在の)インターネット経由のデータ転送にかかるレイテンシが、通信ケーブルを使った場合のそれに比べてはるかに大きくなってしまいます。

GBAのゲームソフトは通信ケーブルを介したデータ通信を想定しており、相手のGBAから受け取ったデータを処理するまでの待機時間も通信ケーブルのレイテンシしか考慮していません。

なので、インターネット間のレイテンシ対策を何もしていない場合、エミュレータにもよりますが、画面上に表示されるデータがおかしくなったり、最悪の場合にはクラッシュしたりします。

よって、エミュレータのネット対戦でデータ転送をスタートした後には、インターネット間のレイテンシの分だけ一旦エミュレータを停止してデータ受信を待つ必要があります。

このようにして2つのGBA間で同期をとる方法をロックステップ(LockStep)といいます。

GBAエミュレータのVisualBoyAdvanceLink(VBALink)では、ロックステップを用いてネット対戦を実現しています。

ロックステップをさらに快適に

上記の方法でインターネット間のGBAエミュレータ同士の同期をとることが可能ですが、まだ問題があります。

それはGBA間のデータ転送の頻度が高いので、転送リクエストに対して同期をとる方法では頻繁にエミュレータの停止が発生するため、レイテンシが大きい場合にエミュレータの処理が追いつかないということです。

そのため、この方法でネット対戦を行うとエミュレータが頻繁に固まってしまいます。

エミュレータによってはこれを面白い方法で改善しています。

通信するもの同士でセーブステート(後述)を共有して通信プレイを開始します。各PCは自分のGBAだけではなく、相手のセーブステートから相手のGBAもエミュレートし、通信プレイを上記のロックステップにより同じPC内でエミュレートします。

セーブステートはゲームソフトのセーブデータとは違ってスナップショットのようにエミュレータの状態を復元するためのステートを記録したデータです。ゲームの巻き戻しや「どこでもセーブ」などでもステートセーブ機能が利用されています。

PC間では、通信ケーブルのデータではなく、GBAのボタン入力(Aとかとか)をインターネットで送信します。

セーブステートとボタン入力が同じならば常に同じステートになるという前提ですが、これならインターネットを通してデータを転送する頻度を1/60秒に1回に抑えることができます。(一般的なGBAゲームでは1フレームごとにユーザーの入力をポーリングするので)

先ほど、VBALinkはロックステップ方式だと言いましたが、VBALinkもこのように1/60秒ごとにボタン入力をやり取りする方法でネット対戦を実現しています。しかし、これでもレイテンシが高い場合は、次のように画面がカクカクしてしまいます。自分も友人と何度かVBALinkを使ってネット対戦をしましたがカクカクするとまでは言わなくても、(おそらくエミュレータが小さく頻繁に停止しているため)水の中にいるようなもっさり感は多々ありました。

YouTubeのvideoIDが不正ですhttps://youtu.be/8WoN49SzVh8?t=81

ロールバックによる快適なネットプレイ

4/26に以下の記事が公開されました。

https://www.therockmanexezone.com/general/2022/04/25/mega-man-battle-network-6-online-pvp-now-has-fan-made-rollback-netcode/

この記事ではTangoというmGBAをロックマンエグゼの通信対戦用にカスタマイズしたエミュレータについて紹介しています。

Tangoではロールバックという技術を使って快適な通信対戦を実現しています。

ロールバックでは、自分のPCがGBAのボタン入力を相手に送信するタイミング、つまり(同時に)相手のPCからGBAのボタン入力を受け取るタイミングのセーブステートを取ります。

そしてインターネット経由で相手からボタン入力を受け取るまでは相手からのボタン入力はないものとしてエミュレーションを続行します。

相手からインターネット経由でデータを受信したときにボタン入力があった場合は、セーブステートのところまでエミュレータを巻き戻し、受け取ったボタン入力を使ってエミュレーションを一気にやり直します。

これによりレイテンシが大きいときでも画面がカクカクすることなく快適なネット対戦を行うことができます。(ただしレイテンシがあまりにも大きい時はキャラがワープして見えることもあります)

この方法はCPUリソースを多く必要としますが、最も先進的なもので、スト5のようなオンライン格闘ゲームも似たような手段で遅延補正をしています。

実際にTangoの開発者のかたがロールバック技術を用いた通信対戦の動画をアップロードしていますが、見ている感じかなり快適そうに通信対戦ができています。

https://youtu.be/UA6cRVLQzGQ

まとめ

非公式ですが、ロールバック方式のネット対戦によってロックマンエグゼの通信対戦が快適にできるようになりそうです。

個人的には、カプコンさんにロールバック方式のネット対戦を導入したロックマンエグゼコレクションを作ってもらえたらいいなと常々思っています。(スト5でその辺の技術は培ってそうなので結構期待している)

趣味全開のわかりづらい記事ですが読んでくださったのなら幸いです。また間違っている点があればご指摘してくださるとありがたいです。

参考記事

Discussion