65

Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Embed Size (px)

Citation preview

Page 1: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 2: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Work

C#

Unity

Private

http://neue.cc/

@neuecc

https://github.com/neuecc/UniRx

Page 3: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

About Grani

モバイル向けゲーム開発企業

http://grani.jp/

2012年設立

代表作として「神獄のヴァルハラゲート」

GREE Platform Awardにて殿堂入り最優秀賞

他、カプコンとの共同開発による「モンスターハンター ロア オブ カード」

iOS/Android向けに次期タイトル「黒騎士と白の魔王」鋭意開発中

Page 4: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 5: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 6: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

using

Page 7: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

using

Page 8: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Unity + Realtime

Page 9: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

すべてが別格のRPGhttps://kuro-kishi.jp

Unity

ASP.NET

Photon

Page 10: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

ゲームのメイン部分

チャット・通知系システム

Page 11: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Socket.io

ASP.NET SignalR

Unity Multiplayer(UNET)

モノビットエンジン

Page 12: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

サーバー側の分散手法が弱い

Unity向けの標準クライアントがない

プロトコルが重い

固定のシリアライゼーションフォーマット

Page 13: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

C#であること

サーバー側にロジックが書けること

大規模MMORPGなどへの発展性があること

実績がある

Page 14: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Photon Family

Page 15: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Realtime/(Turnbased)/Chat/Voice/Server...

Page 16: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

サーバーに実装を入れたい

Page 17: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

PUN(Photon Unity Network)

PUNを使わない100の理由

Page 18: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Getting Started

Photon Server

Page 19: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 20: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 21: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 22: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

実態はただのクラスライブラリ

実行フロー

Page 23: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

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の基礎と応用

// 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の基礎と応用

// 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の基礎と応用

// 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の基礎と応用

// 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の基礎と応用

// 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の基礎と応用
Page 30: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Intro to PhotonWire

Page 31: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

byte, Dictionaryを送りswitch、送り返してswitch

クライアントの送信と受信がバラバラ

Page 32: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 33: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 34: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Typed Asynchronous RPC Layerhttps://github.com/neuecc/PhotonWire

Page 35: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Demo...

Page 36: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

専用のWindowsクライアント

Page 37: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Server to Server

Page 38: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 39: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 40: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 41: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 42: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 43: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
Page 44: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

なにもないことはいいこと

Page 45: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Into the Photon Server

Page 46: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

非常にプリミティブ

複雑な機能は全てロジックに寄る

Page 47: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

接続

Page 48: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

4種類ある送信メソッド

当然受信側も4種類

Page 49: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

SendEvent/OnEvent

SendMessage/OnMessage

SendOperationRequest/OnOperationRequest

SendOperationResponse/OnOperationResponse

Page 50: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

SendEvent/OnEvent

SendMessage/OnMessage

SendOperationRequest/OnOperationRequest

SendOperationResponse/OnOperationResponse

Page 51: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

シリアル化

サポート型は少なめ

Page 52: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Next PhotonWire

Page 53: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

デシリアライズ速度

シリアライザの置き換え

Page 54: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

(De)serialize is slow...

ScriptableObject > JsonUtility > (越えられない壁) > MsgPack > XxxJSON

Page 55: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

デシリアライズしない新フォーマット

C#, Unityにフィットさせる

近日公開予定

Page 56: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Configuration of Photon

Page 57: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

<?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の基礎と応用

<?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の基礎と応用

<?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の基礎と応用

<?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の基礎と応用

<?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の基礎と応用

Conclusion

Page 63: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

真価は出してみないとわからん

Photon Serverは良い

PhotonWireは良い

Page 64: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用

Hiringhttp://recruit.grani.jp/

Page 65: Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用