皆さんは Google Play Games Services (GPGS) を使っていますか?
おそらくスマートフォンゲームを制作している企業の開発者の方々は基本的な機能への対応を済ませていることと思います。
今回は、GPGS の Real-time Multiplayer という機能のリアルタイム性を検証すべく、2 端末間でメッセージを往復させた時にかかる時間について調べました。
まず、GPGS がどういうものか概要を見ていきましょう。
Google Play Games Services では Google+ ログインによりプレーヤーを認証することで以下の様な機能が提供されています。
上記の機能は Google Play のデベロッパーコンソールでゲームを追加することで使うことができます。
GitHub にサンプルコードが用意されています。
https://github.com/playgameservices/android-basic-samples
Real-time Multiplayer を使うことで、自分でサーバを用意しなくても複数人でのリアルタイム通信を実現できます。ここでのリアルタイム通信網は、基本的には P2P ネットワークで構成されます。ファイアーウォールを越えられない場合などは Google のサーバーが中継をします。
プレーヤーが Real-time Multiplayer を使ったゲームを開始するときの手順は下記の通りです。
では、本記事の本題である Real-time Multiplayer を使って 2 端末間でメッセージを往復させた時にかかる時間の測定について以下にまとめます。
使用回線
メッセージングプロトコル
それぞれのメッセージングプロトコルに対してデータ量を 10 bytes から 100 bytes ごとに最大まで、各データ量につき 10 回計測しました。
おまけ(上限調査)
Reliable messaging では上限とされている 1400 bytes 以上のデータを送信できたため、送信データ量を 5000 bytes ずつ増やしながら例外が吐かれるまで計測しました。
各データ量につき 1 回計測しました。
詳細な計測数値は別表に示します。
今回、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
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。
合わせて読みたい
KLabのゲーム開発・運用で培われた技術や挑戦とそのノウハウを発信します。