電話線の時代のRPG、1歩は7バイトだった

2004年のRuneScapeは、毎秒5キロバイトのダイヤルアップ回線で多人数RPGを動かしていた。1歩あるく通信は7バイト、まわりに20人いる場面の更新はおよそ9バイト。

ひかり:部室のWi-Fi、遅すぎっ! ゲーム開くだけで、ぐるぐるがずーっと回ってるんだけどっ!

ことね:ふふ、いい話題ね。ちょうどそういう文章を読んだところなの。……2004年のRuneScape——ブラウザの中で動いていた多人数参加のRPGよ——は、毎秒5キロバイトの回線で何百人も同時に走らせていたの。電話線をモデムにつないで、ピーガガガと鳴らしていた時代の速さね。

みずき:…毎秒5キロバイト。いまスマホで撮った写真、1枚送るのに10分かかる速さでしょ。

ひかり:えっ、10分っ!? そんな細い線でゲームが動くのっ!? キャラが1歩あるくたびに固まっちゃうよっ!

ことね:固まらないのよ。1歩あるくときに送るのは、たったの7バイトだから。内訳もはっきりしていて、何をするかの合図が1、長さが1、行き先の座標が2と2、キーを押していたかどうかが1。……面白いのはね、通った道のマスを全部は送っていないところ。曲がり角だけなの。地図も、どこが歩けてどこが壁かも、あなたの手元とサーバーの両方に最初から入っているでしょう。だから「ここへ行く」とだけ言えば、向こうは同じ計算で道を引き直して、ずるをしていないか確かめられるのよ。

ひかり:へえ〜っ、道は向こうが思い出してくれるんだ! ……でもさ、まわりで他の人が動いてるのは、どうやって分かるのっ?

ことね:そこがいちばん凝っているところ。サーバーは0.6秒ごとに、全員のようすをまとめて配るの。このとき、動いていない人はまるまる1ビット——「変わってないよ」の1回ぶんね。40人ぶんの「変わってない」で、たったの5バイト。動いた人でも7ビットよ。新しく視界に入ってきた人だけ番号を11ビットで送って、位置は「いまの自分から何マスずれているか」を、たてよこ5ビットずつで書くの。画面に映るのは15マスぶんくらいだから、5ビットで足りてしまうのね。……結果、まわりに20人いる場面でも、自分の動きを1人に届ける量はおよそ9バイト。

みずき:…この前のSuicaの0.2秒の話、思い出した。足りないぶんを、速い機械を買ってきて埋めなかったところが似てる。……で、いまのアプリは逆でしょ。中身にいちいち名札を貼って、太らせて送ってる。

ことね:それは、わざと逆にしているのよ。いまのJSONやHTTPは「これは何のデータか」を毎回自分で名乗るぶん太るけれど、送り手と受け手をばらばらに直せるし、途中で覗いて調べられるでしょう。RuneScapeのやり方は正反対で、手元のプログラムとサーバーが同じ表を共有しているのが大前提。片方だけ古いと、もう意味が取れないの。……ちなみに、この解説記事1本ぶんの重さで、さっきの9バイトの更新が3600回ぶん送れる計算ですって。

ひなた:ふぁ〜……分かってくれている相手とは、短いお話ですむのですねえ。……ひなた、おうちで「あれ」って言うと、麦茶が出てくるのです。

まとめ:短く済んだのは通信がうまかったからではなく、両方が同じ地図を先に持っていたから。

元記事を読む / ホームへ