GameCenterを使ったオンライン対戦に挑戦してみる

AppleのGameCenterを使ってiPhoneのゲームでオンライン対戦が出来ることは分かっていたのですが、どの程度のことが出来るのか?

前から気になっていたので、試しにTaiatariにオンライン対戦機能を追加してみました。

気になるのはいったいどの程度の通信を対戦相手とやり取りできるのかとういうところです。

しかもiPhoneだとWi-Fiの他に3G回線で使われることもあるので、いったいどの程度までの通信量に耐えられるのか。

 

いろんなタイプの対戦ゲームがあるでしょうが、Taiatariのようなアクションゲームの場合はリアルタイムに、そこそこの量のデータを対戦相手に送る必要があります。

Taiatariで対戦するというと、まず考えられるパターンは、同じ画面内で互いに体当たりし合って対戦するという方式と、別々の画面でそれぞれプレイして、何かの条件で勝敗を決める方式とが考えられます。

例えるなら、前者がストリートファイター4、後者がぷよぷよでしょうか?

 

同じ画面で対戦するパターンの場合、自分と対戦相手と画面内のほかのキャラクタの座標などの情報を常に双方の端末で同期を取る必要があります。

そうすると、仮にtaiatariで画面に10個のキャラが居るとして、XY座標をfloatで持つとすると、ざっと、10機×4バイト×2=80バイトの情報を一度にやり取りすることになります。

画面更新が一秒間に60回程度とすると、相当の量のデータになります。

これは無理そうだな。。と思ったけど、やってみたらやっぱり厳しかった。

若干動きがカクカクする感じで、この手のゲームとしてはちょっとひと工夫必要な感じ。

逆に言えば、工夫すればゲームになるかも。例えば移動していないキャラのデータは送らないとか、データを圧縮するとか。

ちなみに、テストに使ったのはiPhone 3GS(iOS5 bate)と初代iPad(iOS4)で、実はiPadの方はスムーズに動いた。

それと、iPhoneの方はWi-Fi接続だと遅くて、3G回線だと比較的まともにゲームできた。

3G回線の方がパフォーマンスが良いというのは意外な結果ですが、iPadで問題ないことも合わせて考えると、データの伝送ではなく、前後の処理に時間がかかっている可能性もあるし、iOS5がbetaバージョンなのでもしかしたら正式版では違った結果になったりする可能性も無くはないです。

が、いろんな環境で使われることを考慮すると、やはり極力データの量は押さえるのがGameCenterでオンラインゲームを作る際の肝になりそうに気がします。

それと、遅かったのはデータ受信ではなく、送信する処理の方でした。

ただ、データを送信するときは一気に全部のキャラクタのデータを送るけど、受けるときは一個ずつデータを受け取って処理してたので、この辺のやり方によってもだいぶ違った結果になるかもしれません。

 

次に別の画面でそれぞれプレイする方式。

考えたのは、それぞれが別の画面でTaiatariをプレイして長くプレイできた方が勝ちという方式。

これだけだとつまらないので、コンボなどが出来ると相手側に強い敵を送り込んで邪魔をしたりするようにします。

この方式だと、全てのキャラのデータを送信する必要がなく、自機のライフなどの情報や、コンボできたらその情報、ゲームオーバーの通知などの情報だけ送ればすみますので、劇的にデータ量は減ります。

一度のデータサイズはせいぜい、十数キロバイト程度です。

やってみたら、この程度なら全くストレス無くゲームをすることが出来ました。

子供たちと対戦してみたら、意外と熱くなるバトルになって、最初の方式のガチンコバトルみたいのよりも面白いかも。

しかも、この方式だったらプレイヤーが二人以上でも出来そうです。

iPadとiPhoneで並んで対戦して遊んでいたら、かなり面白い感じでした。

が、ひとつ問題発生。

並んで対戦していたら、ちょっと横を見ると相手の状況が見えるので結構面白いんですが、完全に別な場所でネット対戦して相手の状況が把握できないと、いきなり相手がゲームオーバーになって、自分が唐突に勝利!というのは、あまり面白くない。

やっぱり相手の画面を見て状況が分かるようになってないと、つまらない。。

ということで、下のような画面を考えてみました。

右下に見える黒い部分。ここに対戦相手の画面を小さく見ることが出来ます。

これならいいかな、と思ったけど。。結局全部のキャラクタのデータを送信しなきゃいけないじゃないか。。

で、考えました。

相手の状況が分かるプレビュー画面を表示すればいいので、少しくらいなら情報が遅れてきてもいいじゃないか。

ということで、プレビュー用のキャラクタの座標情報はフレーム毎に1機分だけ送るようにしてみました。

10機のキャラクタがいれば、全部のデータを送るには10フレームかかりますが、それでも1秒で6回ずつ更新されるので、プレビュー画面の表示だけなら十分そうな気がします。

実際にやってみたら、プレビュー画面は若干スムーズさにかけるものの、相手の状況を把握するにはこのくらい間引いてデータを送っても十分で、ゲーム自体がもたつくようなこともなく、快適に対戦できるようになりました。

 

だらだらと書いてきたので、結論ですが、TaiatariのようなOpenGLを使ったようなゲームの対戦で、頻繁にデータの伝送が必要なゲームの場合、一度のデータ量は20バイト程度が限界な感じ。

いかにデータ量を小さくできるかが、GameCenterでオンライン対戦する場合の肝になります。

もちろん、ゲームの種類によって事情が違ってきますが。

例えばボードゲームのようなものだと、一回のデータ量が多少遅くても、特にストレスは感じないでしょうし。

 

で、結構面白く出来そうなので、もうちょっと先になりますがTaiatariにオンライン対戦機能を付けて公開しようと思いますのでお楽しみに。

それまでに、もうちょっとTaiatariのゲーム人口が増えてるといいなぁ。

Bluetoothでのピアツーピア対戦とかも、あったほうがいいのかな?

 

GameCenterのオンライン対戦は、Appleのドキュメントが分かり易いこともあって、メインの対戦部分は割と簡単に作れました。

でも、結構細かいところが面倒です。

たとえば、対戦相手が勝手に切断しちゃったときのこととか、友達から対戦の招待を受けたときの処理とか、細かい考慮がいろいろ必要なんですね。

この辺のノウハウも、暇があったらそのうち書いてみようと思います。

Tags: , , , , , ,