photon server deep dive - photonwireの実装から見つめるphotonserverの基礎と応用
TRANSCRIPT
![Page 1: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/1.jpg)
![Page 2: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/2.jpg)
Work
C#
Unity
Private
http://neue.cc/
@neuecc
https://github.com/neuecc/UniRx
![Page 3: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/3.jpg)
About Grani
モバイル向けゲーム開発企業
http://grani.jp/
2012年設立
代表作として「神獄のヴァルハラゲート」
GREE Platform Awardにて殿堂入り最優秀賞
他、カプコンとの共同開発による「モンスターハンター ロア オブ カード」
iOS/Android向けに次期タイトル「黒騎士と白の魔王」鋭意開発中
![Page 4: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/4.jpg)
![Page 5: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/5.jpg)
![Page 6: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/6.jpg)
using
![Page 7: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/7.jpg)
using
![Page 8: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/8.jpg)
Unity + Realtime
![Page 10: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/10.jpg)
ゲームのメイン部分
チャット・通知系システム
![Page 11: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/11.jpg)
Socket.io
ASP.NET SignalR
Unity Multiplayer(UNET)
モノビットエンジン
![Page 12: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/12.jpg)
サーバー側の分散手法が弱い
Unity向けの標準クライアントがない
プロトコルが重い
固定のシリアライゼーションフォーマット
![Page 13: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/13.jpg)
C#であること
サーバー側にロジックが書けること
大規模MMORPGなどへの発展性があること
実績がある
![Page 14: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/14.jpg)
Photon Family
![Page 15: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/15.jpg)
Realtime/(Turnbased)/Chat/Voice/Server...
![Page 16: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/16.jpg)
サーバーに実装を入れたい
![Page 17: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/17.jpg)
PUN(Photon Unity Network)
PUNを使わない100の理由
![Page 18: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/18.jpg)
Getting Started
Photon Server
![Page 19: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/19.jpg)
![Page 20: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/20.jpg)
![Page 21: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/21.jpg)
![Page 22: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/22.jpg)
実態はただのクラスライブラリ
実行フロー
![Page 23: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/23.jpg)
public class Startup : ApplicationBase{
// サーバーに接続が入った時のコネクション生成ハンドリングprotected override PeerBase CreatePeer(InitRequest initRequest){
if (/* クライアントからのリクエストなら */){
return new MyClientPeer(initRequest);}else // サーバーからのリクエストなら{
return new InboundS2SPeer(initRequest);}
}
protected override void Setup(){
// 起動時の処理// マスターサーバーに繋げるならOutboundS2SPeerを作ったりvar outboundPeer = new OutboundS2SPeer();outboundPeer.ConnectTcp();
}
protected override void TearDown(){
// 終了時の処理}
}
public class MyClientPeer : ClientPeer{
public MyClientPeer(InitRequest initRequest): base(initRequest)
{
}
protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters{
// byte: operationRequest.OperationCode// Dictionary<byte, object>: operationRequest.Parameters
// クライアントにレスポンスを送信this.SendOperationResponse(new OperationResponse(), sendParameters);
}
protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail){}
}
![Page 24: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/24.jpg)
// 1. Unity側からサーバーへ送信var peer = new ClientSidePeer(new MyListener());peer.OpCustom(opCode: 10, parameter: new Dictionary<byte, object>());
// 2. サーバー側が受信するprotected override void OnOperationRequest(OperationRequest operationRequest){
// opCodeで分岐switch (operationRequest.OperationCode){
case 10:// データはDictionaryに詰まってるのでそれを取り出す(<byte, object>)var parameter = operationRequest.Parameters;
/* それを使って何か処理する */
// 3. 処理終わったということでクライアントに結果を送るthis.SendOperationResponse(new OperationResponse(operationCode: 5));break;
default:break;
}}
![Page 25: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/25.jpg)
// Unityクライアント側public class MyListener : IPhotonPeerListener{
// 4. クライアント受信public void OnOperationResponse(OperationResponse operationResponse){
// 返ってきたレスポンスswitch (operationResponse.OperationCode){
case 5:// なんかするbreak;
}}
}
// 3. サーバー側:処理終わったということでクライアントに結果を送るthis.SendOperationResponse(new OperationResponse(operationCode: 5), sendParameters);
![Page 26: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/26.jpg)
// opCodeで分岐switch (operationRequest.OperationCode){
case 0:break;
case 1:break;
case 2:break;
case 3:break;
case 4:break;
case 5:break;
case 6:break;
case 7:break;
case 8:break;
case 9:break
case 10:break;
![Page 27: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/27.jpg)
// opCodeで分岐switch (operationRequest.OperationCode){
case 0:break;
case 1:break;
case 2:break;
case 3:break;
case 4:break;
case 5:break;
![Page 28: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/28.jpg)
// opCodeで分岐switch (operationRequest.OperationCode){
case 0:break;
case 1:break;
case 2:break;
case 3:break;
case 4:
![Page 29: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/29.jpg)
![Page 30: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/30.jpg)
Intro to PhotonWire
![Page 31: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/31.jpg)
byte, Dictionaryを送りswitch、送り返してswitch
クライアントの送信と受信がバラバラ
![Page 32: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/32.jpg)
![Page 33: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/33.jpg)
![Page 34: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/34.jpg)
Typed Asynchronous RPC Layerhttps://github.com/neuecc/PhotonWire
![Page 35: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/35.jpg)
Demo...
![Page 36: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/36.jpg)
専用のWindowsクライアント
![Page 37: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/37.jpg)
Server to Server
![Page 38: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/38.jpg)
![Page 39: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/39.jpg)
![Page 40: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/40.jpg)
![Page 41: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/41.jpg)
![Page 42: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/42.jpg)
![Page 43: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/43.jpg)
![Page 44: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/44.jpg)
なにもないことはいいこと
![Page 45: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/45.jpg)
Into the Photon Server
![Page 46: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/46.jpg)
非常にプリミティブ
複雑な機能は全てロジックに寄る
![Page 47: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/47.jpg)
接続
![Page 48: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/48.jpg)
4種類ある送信メソッド
当然受信側も4種類
![Page 49: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/49.jpg)
SendEvent/OnEvent
SendMessage/OnMessage
SendOperationRequest/OnOperationRequest
SendOperationResponse/OnOperationResponse
![Page 50: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/50.jpg)
SendEvent/OnEvent
SendMessage/OnMessage
SendOperationRequest/OnOperationRequest
SendOperationResponse/OnOperationResponse
![Page 51: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/51.jpg)
シリアル化
サポート型は少なめ
![Page 52: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/52.jpg)
Next PhotonWire
![Page 53: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/53.jpg)
デシリアライズ速度
シリアライザの置き換え
![Page 54: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/54.jpg)
(De)serialize is slow...
ScriptableObject > JsonUtility > (越えられない壁) > MsgPack > XxxJSON
![Page 55: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/55.jpg)
デシリアライズしない新フォーマット
C#, Unityにフィットさせる
近日公開予定
![Page 56: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/56.jpg)
Configuration of Photon
![Page 57: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/57.jpg)
<?xml version="1.0" encoding="shift-jis"?><Configuration>
<DevLocal><!-- CLRVersionを使ってる.NETのバージョンに合わせる。.NET 4.5~6はCLR v4.0 --><Runtime
Assembly="PhotonHostRuntime, Culture=neutral"Type="PhotonHostRuntime.PhotonDomainManager"CLRVersion="v4.0"UnhandledExceptionPolicy="Ignore">
</Runtime>
<!-- InactivityTimeout(ms)はローカルでは0にする(デバッガで止めてる最中にも強制切断が辛いので) --><TCPListeners>
<TCPListener IPAddress="127.0.0.1" Port="4530" ListenBacklog="1000" InactivityTimeout="0" /></TCPListeners>
<Applications Default="MyApp.GameServer" PassUnknownAppsToDefaultApp="true"><Application
Name="MyApp.GameServer"BaseDirectory="MyApp"Assembly="MyApp"Type="MyApp.GameServerStartup"EnableShadowCopy="true"EnableAutoRestart="true"ForceAutoRestart="true"ApplicationRootDirectory="PhotonLibs">
</Application></Applications>
</DevLocal></Configuration>
![Page 58: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/58.jpg)
<?xml version="1.0" encoding="shift-jis"?><Configuration>
<DevLocal><!-- CLRVersionを使ってる.NETのバージョンに合わせる。.NET 4.5~6はCLR v4.0 --><Runtime
Assembly="PhotonHostRuntime, Culture=neutral"Type="PhotonHostRuntime.PhotonDomainManager"CLRVersion="v4.0"UnhandledExceptionPolicy="Ignore">
</Runtime>
<!-- InactivityTimeout(ms)はローカルでは0にする(デバッガで止めてる最中にも強制切断が辛いので) --><TCPListeners>
<TCPListener IPAddress="127.0.0.1" Port="4530" ListenBacklog="1000" InactivityTimeout="0" /></TCPListeners>
<Applications Default="MyApp.GameServer" PassUnknownAppsToDefaultApp="true"><Application
Name="MyApp.GameServer"BaseDirectory="MyApp"Assembly="MyApp"Type="MyApp.GameServerStartup"EnableShadowCopy="true"EnableAutoRestart="true"ForceAutoRestart="true"ApplicationRootDirectory="PhotonLibs">
</Application></Applications>
</DevLocal></Configuration>
![Page 59: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/59.jpg)
<?xml version="1.0" encoding="shift-jis"?><Configuration>
<DevLocal><!-- CLRVersionを使ってる.NETのバージョンに合わせる。.NET 4.5~6はCLR v4.0 --><Runtime
Assembly="PhotonHostRuntime, Culture=neutral"Type="PhotonHostRuntime.PhotonDomainManager"CLRVersion="v4.0"UnhandledExceptionPolicy="Ignore">
</Runtime>
<!-- InactivityTimeout(ms)はローカルでは0にする(デバッガで止めてる最中にも強制切断が辛いので) --><TCPListeners>
<TCPListener IPAddress="127.0.0.1" Port="4530" ListenBacklog="1000" InactivityTimeout="0" /></TCPListeners>
<Applications Default="MyApp.GameServer" PassUnknownAppsToDefaultApp="true"><Application
Name="MyApp.GameServer"BaseDirectory="MyApp"Assembly="MyApp"Type="MyApp.GameServerStartup"EnableShadowCopy="true"EnableAutoRestart="true"ForceAutoRestart="true"ApplicationRootDirectory="PhotonLibs">
</Application></Applications>
</DevLocal></Configuration>
![Page 60: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/60.jpg)
<?xml version="1.0" encoding="shift-jis"?><Configuration>
<DevLocal><!-- CLRVersionを使ってる.NETのバージョンに合わせる。.NET 4.5~6はCLR v4.0 --><Runtime
Assembly="PhotonHostRuntime, Culture=neutral"Type="PhotonHostRuntime.PhotonDomainManager"CLRVersion="v4.0"UnhandledExceptionPolicy="Ignore">
</Runtime>
<!-- InactivityTimeout(ms)はローカルでは0にする(デバッガで止めてる最中にも強制切断が辛いので) --><TCPListeners>
<TCPListener IPAddress="127.0.0.1" Port="4530" ListenBacklog="1000" InactivityTimeout="0" /></TCPListeners>
<Applications Default="MyApp.GameServer" PassUnknownAppsToDefaultApp="true"><Application
Name="MyApp.GameServer"BaseDirectory="MyApp"Assembly="MyApp"Type="MyApp.GameServerStartup"EnableShadowCopy="true"EnableAutoRestart="true"ForceAutoRestart="true"ApplicationRootDirectory="PhotonLibs">
</Application></Applications>
</DevLocal></Configuration>
![Page 61: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/61.jpg)
<?xml version="1.0" encoding="shift-jis"?><Configuration>
<DevLocal><!-- CLRVersionを使ってる.NETのバージョンに合わせる。.NET 4.5~6はCLR v4.0 --><Runtime
Assembly="PhotonHostRuntime, Culture=neutral"Type="PhotonHostRuntime.PhotonDomainManager"CLRVersion="v4.0"UnhandledExceptionPolicy="Ignore">
</Runtime>
<!-- InactivityTimeout(ms)はローカルでは0にする(デバッガで止めてる最中にも強制切断が辛いので) --><TCPListeners>
<TCPListener IPAddress="127.0.0.1" Port="4530" ListenBacklog="1000" InactivityTimeout="0" /></TCPListeners>
<Applications Default="MyApp.GameServer" PassUnknownAppsToDefaultApp="true"><Application
Name="MyApp.GameServer"BaseDirectory="MyApp"Assembly="MyApp"Type="MyApp.GameServerStartup"EnableShadowCopy="true"EnableAutoRestart="true"ForceAutoRestart="true"ApplicationRootDirectory="PhotonLibs">
</Application></Applications>
</DevLocal></Configuration>
![Page 62: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/62.jpg)
Conclusion
![Page 63: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/63.jpg)
真価は出してみないとわからん
Photon Serverは良い
PhotonWireは良い
![Page 65: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用](https://reader034.vdocuments.mx/reader034/viewer/2022051101/586f710d1a28ab10258b4dff/html5/thumbnails/65.jpg)