皆さんは Google Play Games Services (GPGS) を使っていますか?
おそらくスマートフォンゲームを制作している企業の開発者の方々は基本的な機能への対応を済ませていることと思います。

今回は、GPGS の Real-time Multiplayer という機能のリアルタイム性を検証すべく、2 端末間でメッセージを往復させた時にかかる時間について調べました。

まず、GPGS がどういうものか概要を見ていきましょう。

Google Play Games Services とは

Google Play Games Services では Google+ ログインによりプレーヤーを認証することで以下の様な機能が提供されています。

Leaderboards
全世界でのランキングやソーシャル内でのランキングが見ることができます。
Achievements(実績)
プレーヤーは条件を達成することで実績を得て、それに応じた経験値を得ることができます。
Saved Games(クラウド保存)
ゲームのセーブデータを Google のサーバーに保存でき、それらは複数端末で同期されます。
Real-time Multiplayer
最大8人の部屋を作りその中でリアルタイム通信をすることができます。
Turn-based Multiplayer
最大8人の部屋を作りその中でターン制ゲームをすることができます。
Events and Quests
プレーヤーの進行度合いを集計し統計解析することができます。

上記の機能は Google Play のデベロッパーコンソールでゲームを追加することで使うことができます。
GitHub にサンプルコードが用意されています。
https://github.com/playgameservices/android-basic-samples

Real-time Multiplayer

Real-time Multiplayer を使うことで、自分でサーバを用意しなくても複数人でのリアルタイム通信を実現できます。ここでのリアルタイム通信網は、基本的には P2P ネットワークで構成されます。ファイアーウォールを越えられない場合などは Google のサーバーが中継をします。

プレーヤーが Real-time Multiplayer を使ったゲームを開始するときの手順は下記の通りです。

  • ゲーム画面から Google+ ログイン
  • ゲーム画面から自動選択(ランダムマッチ)をするか、友達の招待をするかを選択
  • GPGS の画面が起動
    • 自動選択の場合は選択されるまで待機
    • 友達を招待する場合はどの友達を招待するかを選択してそれが許諾されるのを待機
  • お互いのプレーヤーの準備ができると、ゲーム画面に戻ってゲーム開始

検証実験

では、本記事の本題である Real-time Multiplayer を使って 2 端末間でメッセージを往復させた時にかかる時間の測定について以下にまとめます。

検証方法

使用回線

  • au LTE – docomo LTE(国内通信)
  • au LTE – AT&T LTE(日米間通信)

メッセージングプロトコル

  • Reliable messaging [max:1400 bytes]
    • 遅いが欠落なし
    • おそらく TCP
    • 1メッセージ当たりの最大データ量 1400 bytes
  • Unreliable messaging [max:1168 bytes]
    • 速いが欠落あり
    • おそらく UDP
    • 1メッセージ当たりの最大データ量 1168 bytes

それぞれのメッセージングプロトコルに対してデータ量を 10 bytes から 100 bytes ごとに最大まで、各データ量につき 10 回計測しました。

おまけ(上限調査)
Reliable messaging では上限とされている 1400 bytes 以上のデータを送信できたため、送信データ量を 5000 bytes ずつ増やしながら例外が吐かれるまで計測しました。
各データ量につき 1 回計測しました。

検証結果

検証結果1


国内通信、日米間通信

検証結果2


おまけ(上限調査)

詳細な計測数値は別表に示します。

まとめ

今回、Google Play Games Services の Real-time Multiplayer について、信頼性の高い Reliable messaging と信頼性の低い Unreliable messaging それぞれの通信速度を、送信データ量を変えながら計測しました。メッセージのデータ量による通信時間変化は、規格として定められている範囲では特に大きな差はありませんでした。
通信時間はおおよそ下記のとおりとなりました。

Reliable Unreliable
国内 約 750ms 約 120ms
日米間 約 700ms 約 230ms

Unreliable(内部ではおそらく UDP が使われている)では距離の差が通信時間に表れました。
一方 Reliable(内部ではおそらく TCP が使われている)は、コネクションの確立等で Unreliable よりも距離の影響を受けそうですが、今回の計測では日本国内でも日米間でもほぼ変わらないという結果となりました。
GPGS Real-time Multiplayer の通信では、Google のサーバーでユーザーのマッチング処理をした後、できれば P2P でできれなければ Google のサーバーを経由で通信します。なので、地理的距離が近い場合でも遠い Google のサーバーに接続している可能性があります。
ただし、今回はパケットキャプチャを行わなかったので正確な原因は分かりません。

使いにくい点は多々あるかとは思いますが、自身でサーバーを用意することなく Android 開発者アカウントがあれば手軽にリアルタイム通信を使えることは大きなメリットかと思います。興味のある方はぜひ使ってみてください。

以上、Google Play Games Services Real-time Multiplayer の通信時間計測レポートでした。

別表 検証結果

Reliable(国内)

データ量 [byte] 10 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400
1 回目 [ms] 640 836 862 698 724 701 703 694 730 707 719 722 745 734 724
2 回目 [ms] 920 713 774 714 703 687 725 716 712 712 720 681 822 758 747
3 回目 [ms] 715 680 659 888 903 691 725 725 725 821 758 716 741 739 727
4 回目 [ms] 726 891 702 706 696 716 711 707 704 696 721 756 783 869 700
5 回目 [ms] 693 714 737 691 773 792 697 819 836 716 716 765 742 708 691
6 回目 [ms] 770 733 690 825 729 777 789 757 722 707 737 721 732 708 694
7 回目 [ms] 705 771 714 710 742 700 738 718 706 731 739 755 733 722 704
8 回目 [ms] 747 804 681 783 766 784 700 838 739 689 760 889 726 722 750
9 回目 [ms] 707 664 713 694 858 723 707 711 766 773 838 746 723 726 709
10 回目 [ms] 706 776 683 682 708 706 762 736 743 735 854 728 824 697 720
平均 [ms] 732.9 758.2 721.5 739.1 760.2 727.7 725.7 742.1 738.3 728.7 756.2 747.9 757.1 738.3 716.6

Unreliable(国内)

データ量 [byte] 10 100 200 300 400 500 600 700 800 900 1000 1100 1168
1 回目 [ms] 249 105 105 128 117 114 291 130 107 150 118 136 142
2 回目 [ms] 102 89 84 94 108 107 103 113 85 143 130 131 169
3 回目 [ms] 78 110 110 127 96 213 127 116 155 123 107 164 99
4 回目 [ms] 94 98 81 80 111 109 116 195 96 115 131 134 72
5 回目 [ms] 126 93 106 79 97 114 122 112 110 133 128 112 96
6 回目 [ms] 104 109 84 98 112 111 110 124 125 140 151 120 94
7 回目 [ms] 86 130 109 93 113 129 116 111 113 139 126 135 116
8 回目 [ms] 100 109 97 110 127 132 109 108 123 111 126 115 86
9 回目 [ms] 94 81 90 100 119 129 125 109 115 100 117 111 120
10 回目 [ms] 86 80 83 110 124 177 123 151 146 128 122 139 107
平均 [ms] 100.4 94.9 101.9 112.4 133.5 134.2 126.9 117.5 128.2 125.6 125.6 129.7 110.1

Reliable(日米)

データ量 [byte] 10 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400
1 回目 [ms] 601 651 635 648 678 719 703 753 709 583 702 709 773 707 660
2 回目 [ms] 588 654 663 677 680 679 603 606 639 696 665 745 741 709 834
3 回目 [ms] 711 651 671 689 708 673 731 593 700 663 574 711 643 749 891
4 回目 [ms] 639 650 675 651 744 696 619 692 807 684 767 721 687 706 692
5 回目 [ms] 713 652 677 660 656 628 606 658 716 644 656 703 727 662 723
6 回目 [ms] 620 684 661 671 741 872 655 590 734 656 625 754 668 805 723
7 回目 [ms] 625 620 696 688 650 638 708 710 606 648 754 576 678 682 693
8 回目 [ms] 630 681 671 649 668 719 621 614 849 725 625 705 647 722 687
9 回目 [ms] 712 678 627 644 659 659 830 746 643 693 753 686 699 683 749
10 回目 [ms] 597 588 669 652 782 658 628 661 804 648 606 662 669 752 658
平均 [ms] 643.6 650.9 664.5 662.9 696.6 694.1 670.4 662.3 720.7 664 672.7 697.2 693.2 717.7 731

Unreliable(日米)

データ量 [byte] 10 100 200 300 400 500 600 700 800 900 1000 1100 1168
1 回目 [ms] 236 219 212 217 206 242 240 246 234 226 256 286 273
2 回目 [ms] 189 240 234 214 234 189 241 200 226 244 238 243 258
3 回目 [ms] 238 191 215 196 207 210 188 216 216 278 219 244 272
4 回目 [ms] 204 203 228 209 222 250 231 227 189 245 246 249 258
5 回目 [ms] 190 198 189 202 186 250 235 190 240 281 266 232 299
6 回目 [ms] 190 194 245 192 199 202 210 250 259 263 276 255 247
7 回目 [ms] 196 245 177 205 265 194 190 249 240 223 257 276 230
8 回目 [ms] 234 186 209 196 201 216 240 231 239 252 212 281 259
9 回目 [ms] 190 236 248 304 196 208 222 220 231 198 277 291 253
10 回目 [ms] 208 222 214 220 201 179 201 226 233 217 257 381 229
平均 [ms] 213.4 217.1 215.5 211.7 214 219.8 225.5 230.7 242.7 250.4 250.4 273.8 257.8

Reliable(上限調査)

データ量 [byte] 5000 10000 15000 20000 25000 30000 35000 40000 45000 50000 55000 60000 65000 70000 75000 80000 85000 90000 95000 100000 105000 110000 115000 120000 125000 130000 135000 140000 145000 150000
計測時間 [ms] 713 1012 1018 1187 1381 1473 1679 1666 1759 1772 2056 2067 2103 2297 2544 2589 2350 2820 2897 2455 2574 2742 2981 2835 3189 3104 3338 2903 3161 3183

データ量 [byte] 155000 160000 165000 170000 175000 180000 185000 190000 195000 200000 200000 205000 210000 215000 220000 225000 230000 235000 240000 245000 250000 255000 260000 265000 270000 275000 280000 285000 290000 295000
計測時間 [ms] 3455 3360 3417 3448 3719 3561 3807 3823 3843 3979 5285 4780 4444 4242 4269 4592 4748 4546 4864 4729 4165 4785 4713 4511 4887 4712 4796 4736 5795 4907

データ量 [byte] 300000 305000 310000 315000 320000 325000 330000 335000 340000 345000 350000 355000 360000 365000 370000 375000 380000 385000 390000 395000 400000 405000 410000 415000 420000 425000 430000 435000 440000 445000
計測時間 [ms] 5066 5412 5170 5720 5593 5316 5819 5838 6311 6648 5678 6015 6304 5979 8921 5989 5811 6122 6216 6326 6606 6305 6233 7926 7991 6561 9879 7096 6791 7075

データ量 [byte] 450000 455000 460000 465000 470000 475000 480000 485000 490000 495000 500000 505000 510000 515000
計測時間 [ms] 7523 6933 9748 6916 7174 6760 7049 7158 7512 7119 7131 7070 7295 7856

Yuta Watanabe, @kakkun61