私はゲームも好きなので時間のある時に一気にプレイしていますが、最近遭遇した状況が面白かったので記事にしました。
Table of Contents
Path of Exile(PoE)
紹介したいゲームはSteamの無料で遊べる”Path of Exile”です。
背景として、このゲームは3カ月ごとに新しいリーグに切り替わり、新スキル、新装備が実装されます。
その際にステータスや所持品、LVなど全てリセットされた状態でリスタートします。
日本にもサーバがあるためラグは感じず、快適にプレイすることが出来ます。普通に面白い*ハクスラです。
*ハクスラとは
ハック&スラッシュの略で、敵を倒して入手した経験値やレアアイテムでキャラクターを強化し、さらに強い敵とのバトルに挑んでいくジャンル。
そうはならんやろ…
面白いゲームなだけあり、毎期リーグがスタートする際には多くの人が一斉にログインするためログイン待ちという状況が往々にして発生します。
普段は多くても1,2万人のログイン待ちで数分待っていればサーバにログインすることが出来るのですが、今期のリーグスタート時ではサーバ側で不具合が発生してしまったらしく以下のような状況に陥ってしまっていました。
着目してほしいのは、一番下の行”There are 4294960416 people ahead of you in the queue”です。
訳すと、あなたの前にログイン待ち(queue)が4294960416人います。
・・・?
数が分かりにくいのでコンマを挟むと4,294,960,416です。つまり約43億人待ち状態ですと…これには爆笑です(笑)
日本の人口が、現在約1.2億人ですのでだいたい日本36個分。世界人口でも78億人ですので、55%に匹敵します。
二人に一人以上の割合でこのゲームのログイン待ちしているのは面白すぎます。
何故こんなことに?
少しコンピュータに詳しい方は想像がつくと思いますが、明らかに変数にsigned型ではなくunsigned型を使っているせいですね。
簡単に説明すると
unsigned型変数: 全てのbitを用いて数字を示す
signed型変数 : 一番左の大きな数字を表すbitに正負(正:0, 負:1)を示し、それ以外のbitで数字を示す
例を出すと
unsigned型変数: 1001 ⇒ 9
signed型変数 : 1001 ⇒ -7
では話を戻しますが、今回のログイン待ち人数はどのように管理されるでしょうか。
普通に考えると次のようにカウントダウンします。
1000人 ⇒ 999人 ⇒ … ⇒ 2人 ⇒ 1人 ⇒ ログイン(0人)
しかし何故かログイン待ちの人数が0人になってもカウントダウンが進んでしまいました。
1000人 ⇒ 999人 ⇒ … ⇒ 2人 ⇒ 1人 ⇒ ログインせず(0人) ⇒ -1人
これを2進数(signed型)で表現すると
0011 1110 1000 ⇒ 0011 1110 0111 ⇒ … ⇒ 0000 0000 0010 ⇒ 0000 0000 0001 ⇒ 0000 0000 0000 ⇒ 1111 1111 1111
最後の1111 1111 1111を間違えてunsigned形で解釈すると-1ではなく4095となります。
では今回の4294960416を2進数で表現するとどうなるでしょうか?
以下のようになりますね
1111 1111 1111 1111 1110 0101 0010 0000
32Bitのsigned型を使用していそうなことが伺えますね。
本来は-6880を表現したかったのでしょう。(その時点でバグってますが…)
しかし、一般的に考えて行列待ちの人数がマイナスということはあり得ません。そのため、表示する数としてはunsigned型変数を用いるのは妥当に感じます。
その結果、unsigned型で1111 1111 1111 1111 1110 0101 0010 0000を表示して4,294,960,416なんて阿保みたいな数が出てきたんですね。
背景を考えると簡単なミスですが、実際にサービスされているものでこのような状況に陥った場合、運営側のことを考えるとなんとも言えないですね。
私と兄は爆笑出来で良かったですが(笑)
実際に私もIT業界で働いているためバグの怖さは知っていますが、ゲームで発生し得るバグなんて無数に存在するため、ゲームリリース前の評価を担当している人はかなり苦労しているのがなんとなく分かります。
頑張って面白いゲームをリリースしていただいて感謝です。
以上、面白かったため記事として挙げました。ここまで読んでいただき、ありがとうございました。
コメント