Photon

デバッグしてたら10秒でタイムアウトしてしまう

  • Phptonで通信中にデバッグしているといつの間にか切断されてしまうことがある。というか数秒程度ブレークポイントからトレースなどしていると応答なしと判断されるのか、すぐに切れてしまうので注意!どうもぴったり10秒で切れてしまうようである。調べてみるとPhotonCloudでは10000msでタイムアウトしてしまうような設定になっており、これを回避するにはサーバー側のコンフィグを操作する必要がある。PhotonServerのSDKを使って自分でサーバーを立てられる場合はこの設定をいじることが可能であるが、PhotonCloudを用いたサーバー利用ではこの値をいじることができない。したがってブレークポイントでデバッグするときには、超高速でデバッグするスキルを身につけなくてはならない。

Photonの高速性

Photonではデータの送信量と頻度によって速度が変わる。速度が変わるというよりは、どこかに閾値があって、それの範囲内に収まっている間は非常に調子がいい。調子がいい時は受信速度が60FPSを維持できる驚異的な速さである。

送信量時間1備考
128bytes9:969
256bytes10:102
512bytes10:11610秒で600フレームでてる!?送受信、動作ともに60FPS駆動
728bytes150秒秒間4受信程度、i動作速度10FPS

しかし大量のデータを送信すると遅くなって調子が悪くなる。調子が悪くなってからは通信中にPhotonとのコネクションそのものが途切れてしまうこともあって、勝手にルームから退出してしまうことがある。この状態は、しばらく復旧しないが時間がたつとまた速くなる。

送信量時間1備考
128bytes10.9360FPS程度
512bytes72.42315FPS程度

これらからいえることは、送信量が512bytesを超えると急に遅くなる。それまでは60FPSを維持できてるあたり恐ろしく速い。そして、大量に送信した後は、どうも512Bytes以内でも期待した速度がでないことがある。それどころかgxLibのフレームレートも極端にさがってくる。これはシングルスレッドで周っているPhotonの処理でもっていかれている。

無理やり1024bytesを送ったときは5分経っても終わらないどころか中継していたHUBが死んだ。どうも大量のパケットを送受信するとハブやルーターへの負荷が想像以上に高くなるようである。そういえば、昔もP2Pを研究しているときに限ってハブやルーターを何度か買い替えた記憶があるが、そういうことかもしれない。大量の送信でPhotonとの通信が遅くなるのは通信機器のせいもあるかもしれない。

データの信頼性

UDPに設定していると、ご多分にもれずよくパケットロスが発生する。不定期に大きなパケロス(30フレーム分くらい一気にロス)が発生する。このあたりは通信機器のせいもあるかもしれない。PhotonでUDPを使うからと言って、別にロスしないような対策が入っているわけではなく、この辺りは普通である。むしろパケロス対策などを入れてくれておそくなるのではUDPを使う意味がないので、これはこれでいい。PUNではパケットの中身が部分的に欠損してたりといった症状はまだ見たことがないが、C++のSDKで直接送受信していると、そういった現象はそれなりに起こるので受信データのチェックは必ず必要である。

TCP vs UDP

で、UDPではデータの通信速度が速いものの信頼性に乏しいのでTCPを使ってみる。そしてここで驚愕の事実を知ることになる。なんと実はTCPでも同様の速さを確保できたので下の表を見てもらいたい。

送信量時間1備考
256bytes9:986
512bytes10:002

うをを、凄い!512bytes送信でパケロスなし、そしてフルフレームを確保しているじゃないですか!しかもTCP/UDPを比較してみるとわずかにTCPが速いという謎の結果になっており最速で100msかかっていたのがウソのような速さで正直驚いている。PUNでも同様の結果がでているのが驚き。

728bytes10:002
1024bytes10:161

しかもTCPだと512bytesを超えても遅くならない????しかもUDPで5分以上かかっていた1024bytesの送信も大丈夫とはこれ如何に!!!???まったく謎の技術である。

つまりこの時点でUDPを使うメリットが何も感じられない。

UE4でPhotonを使ってみる

書いてあるSDKの組み込みをそのまんま手順通りに行ってもうまくいかないので注意。とはいえ、PhotonのSDKは、ライブラリをC++側からリンクするための設定が必要なだけで、特にUE4だからといってUE4に便利な施策があるわけではない感じ。UE4で自分でSocket通信をするときと同じく、普通のCライブラリのリンクを行うだけである。ドキュメントに書いてある内容に加えてbuild.csにこれを加えると動かすことができる。

using System;
using System.IO;
using UnrealBuildTool;

DEMO

デモを実行してみる。いくつかデモがあるがチャットとかわかりやすそうではある。

  • コマンドラインにひたすらログが流れる。
    何を意味しているのかさっぱり分からない。そもそも1台でしか起動していないこのデモで誰と何をチャットしてるのか?怖い
  • とりあえずAPPIDを入れておかなければエラーになることだけは分かった。

次にパーティクルというデモを実行してみる。派手な画面を期待したけれども、やっぱりコマンドラインでログが流れるだけ。シンプルでいいんだけど、なんともわかりにくいな

とりあえずプログラムを追いかけてみるしかなさそう。

Photon Windows SDK


Photon is the world's #1 independent networking engine and multiplayer platform — Fast, reliable, scalable.
Photonは、世界でも第1位の独立したネットワークエンジンとマルチプレイヤープラットフォームです - 高速で信頼性が高く拡張性があります。

Use the Photon Windows SDK to easily add multiplayer to your games.
Run them in the global Photon Cloud or host your own Photon Servers.
Match your players to a shared game session (called "room") and transfer messages synchronously, in real-time, between connected players across platforms.
All client SDKs can interact with each other, no matter if iOS, Android, web, console or standalone.

Photon Windows SDKを使用すると、ゲームにマルチプレイヤーを簡単に追加できます。
グローバルなPhoton Cloudでそれらを実行するか、独自のPhoton Serverをホストします。
プレーヤを共有ゲームセッション(「ルーム」と呼ばれます)に合わせて、プラットフォーム間で接続されたプレーヤ間でメッセージをリアルタイムで同期して転送します。
すべてのクライアントSDKは、iOS、Android、Web、コンソール、またはスタンドアロンのいずれであっても相互にやりとりできます。

Package Contents


/Chat-cpp - Photon Chat sources
/Common-cpp - common sources
/doc - Release history, API documentation
/LoadBalancing-cpp - Loadbalancing specific sources
/Photon-cpp - common Photon sources
/Demos

   
	/demo_basics:
	The demo client is basically a 'Hello World'. So it's the best place to start if you are new to the SDK.
	デモクライアントは基本的な「Hello World」です。したがって、SDKを初めてお使いの方には最適な場所です。
	/demo_chat:
	The demo shows a basic way of using the Photon Chat API.
	このデモでは、Photon Chat APIを使用する基本的な方法を示します。
   /demo_loadbalancing:
   The demo client connects to a master server and shows how to create a room, join a random game and how to send and receive events within a running game.
	デモクライアントはマスターサーバーに接続し、部屋を作成する方法、ランダムゲームに参加する方法、
	実行中のゲーム内でイベントを送受信する方法を示します。
	/demo_memory:
	This demo displays Photon's asynchronous turnbased features in a game of Memory. This uses the Cocos2D-x graphics engine.
	このデモでは、ゲームのメモリ内にあるPhotonの非同期ターンベースの機能を表示します。これは、Cocos2D-xグラフィックエンジンを使用します。
	
	/demo_particle:
	The demo client connects to a master server and shows the random matchmaking mechanism, how to create a room and how to send and receive events within a running game.
   Players move 'their' blocks around and the positions are updated in realtime between clients.
	デモクライアントはマスターサーバーに接続し、ランダムなマッチメーキングの仕組み、部屋の作成方法、
	実行中のゲーム内でのイベントの送受信方法を示します。
   プレイヤーは自分のブロックを移動し、クライアント間でポジションがリアルタイムで更新されます。
	
	/demo_typeSupport:
   This demo displays the proper use of Photon's serializable data types.
	このデモでは、Photonのシリアライズ可能なデータ型の使い方を表示します。

Contact


To get in touch with other Photon developers and our engineers, visit our Developer Forum:
他のPhoton開発者やエンジニアと連絡を取るには、Developer Forumをご覧ください:
https://forum.photonengine.com

Keep yourself up to date following Exit Games on Twitter http://twitter.com/exitgames
and our blog at http://blog.photonengine.com/.