5.7K Views
July 04, 17
スライド概要
2017年7月2日に行われたライセンシー様向けMO勉強会の資料です。実践編② (登壇者: ソレイユ株式会社 田中さま 衣笠さま)
Unreal Engineを開発・提供しているエピック ゲームズ ジャパンによる公式アカウントです。 勉強会や配信などで行った講演資料を公開しています。 公式サイトはこちら https://www.unrealengine.com/ja/
Multiplayer Online DeepDive ソレイユ株式会社 UE4でのマルチプレイアクションゲームの開発 2017/07/02
会社紹介 ソレイユ株式会社 開発Title ● ● ● ● Devil’s Third (WiiU) Devil’s Third Online (PC) NARUTO TO BORUTO シノビストライカー(PS4/Xbox One/PC) 開発中 その他開発中Title複数 Devil’s ThirdはUE3、他はUE4で開発中 2
スピーカー紹介 ソレイユ(株) エンジニア 衣笠 友宣 Devil’s Third SeriesでGame Rule周りを担当 UE3のReplication周りはよく触っていた それ以前はXbox・Xbox 360・PC・PS3でのOnline機能開発を経験 C++の勉強会などを聴きに行っている 3
アジェンダ ● ● ● ● Dedicated Server vs Listen Server それぞれの利点、欠点 Application Server 通信プロトコル TCP接続 4
Dedicated Server と Listen Server UE4でのMultiplay Gameの通信方式には2種類の形式がある 一つ目はDedicated Server。もう一つはListen Server Full Mesh P2Pには対応していない 5
Dedicated Server ● ● ● ● ● Game Clientとは別にGameを制御するServer Dedicated ServerはGame運営側に設置されているのが一般的。開発中はLocalで 起動することも Dedicated ServerはClientと同じPlatformである必要は無く、WindowsやLinuxで稼 働し、PS4のClientと通信するなどの運用も可能。描画は行わないので、Resourceは 少なくて済む 1つの対戦Group毎に1つのDedicated Serverを起動する必要がある 一台のServer内で複数Process起動することが可能 6
Dedicated Serverの概念図 Dedicated Server Client Client Client Client 各ClientはDedicated Serverと通信をしながら Gameを進行する 7
Dedicated Serverの利点 ● ● ● ● ● ● 特定のClientに処理が集中せず、安定した負荷がかかる 実際のGame進行、判定がServer側で行われるので、Cheatされにくい 通信状態が悪いほかのClientの影響を受けにくい Clientが切断されてもGame進行を止めなくて良い Gameの進行が運営の安定制御下にある前提で実装できるので、信頼性が高い 限定的な更新ならDedicated Server側だけの更新で済む場合も 8
Dedicated Serverの欠点 ● ● ● Serverの設置、運営、通信にCostがかかる Session毎にServerを割り当て、Dedicated Server Processを起動する仕組みが必要 になる ClientのBuildとほぼセットでServer ProgramもBuildする必要がある 9
Listen Server Listen Serverは対戦するClientの1つがServerも兼ねる。 別途Serverを置く必要は無い Client Client Client Client Listen Server local player処理も する Client Client 10
Listen Serverの利点 ● ● 対戦用にDedicated Server用のServerを用意する必要が無いためServer Costが比 較的安く済む 通信的に近いUserをMatchingさせることで、Dedicated ServerよりもResponseが良く なる可能性がある 11
Listen Serverの欠点 ● ● ● Listen ServerになったClientに処理と通信が集中しやすい Listen ServerになったClientの通信状態が悪いとSession全体に影響する Listen ServerになったClientが切断するとSessionがそのまま終了してしまう ※回避方法が無くはないが、実装が大変になる 12
Listen Serverが有利になる例 Dedicated ServerとClientの距離関係によってはListen Serverの方がResponseが良くな るCaseがある 具体的には、Dedicated Serverがアメリカ東海岸にあり、Clientが西海岸にいる場合、全 ての通信が東海岸と西海岸を往復することになる Listen Server Typeで、なるべく近いUser同士をMatchingさせることによって、Dedicated ServerよりもResponseが良い条件を産み出せる 13
どちらのServer Typeで開発するか 今までのTitleはDedicated Serverで運営していたが、開発中の幾つかのTitleはListen Serverでの運営を検討中 ◯ ◯ ✗ ✗ Server周りのCostが大幅に下がるのは嬉しい うまくMatchingすればResponseも良くなる? 商業Baseでの事例が少ない Listen ServerになったClientに負荷が集中するのが心配 14
Listen Serverでの開発 Listen ServerはServerとClient両方の処理が必要になる ● Listen ServerにRepNotify Eventは来ない ○ ● 各Clientに変数Replicateした時の処理は Listen Serverも呼ぶ必要がある Server Typeの方針変更時にServer処理Client処理の修正が入る Dedicated ServerとListen Server両対応の複製処理を書いておくと変更に強い ● ● World::GetNetMode()で分岐する BlueprintCosmetic関数指定子(未経験) 15
Application Server TitleやPublisher独自の機能を実現するためPlatform Serverとは別に通信するServer ● ● ● ● ● ● Login Bonusの付与 独自性の高いEvent開催とRanking System、それに伴う報酬付与 Publisher Accountとの紐付け Publisher決済Systemの使用 User DataのCloud保存 Platform間の機能差異の吸収(UEでも吸収しきれないような機能) 16
通信Protocol Online Gameで通信に使用するProtocol ● ● UDP TCP ○ ○ HTTP/HTTPS ■ REST API WebSocket Application Serverとの通信はREST APIやWebSocketが多いのでは? HTTPを扱うUE ModuleはFHttpModuleのようだが大変そう 大変そうで一般的なものなら誰かがPluginを作っているはず 17
REST API Plugin REST APIでJSONを扱う通信Plugin ● Json Query ○ ✗ ● VaRest ○ ○ ● https://wiki.unrealengine.com/JSON_Query License未記載! https://wiki.unrealengine.com/VaRest_Plugin MIT License WebApiプラグイン ○ ○ https://github.com/HogeTatu/UE4Plugin_WebApi MIT License Object配列など未対応の場合もある。採用時は使用構造に対応しているか確認を 18
TCP通信 Application ServerによってはTCP接続を要求される事もある TCP接続はSockets moduleをBuild.csに追加して、以下のClassを使ってSocket Programmingを行う ● ● ● FTcpSocketBuilder: Socket作成Parameter設定Class ISocketSubsystem: Socket関連機能の各Platform差異吸収Interface FSocket: Socketの実体Class 19
TCP通信 手順は以下が参考になる listenで待受する場合 ● https://wiki.unrealengine.com/TCP_Socket_Listener,_Receive_Binary_Data_From _an_IP/Port_Into_UE4,_(Full_Code_Sample) connectで接続に行く場合 ● https://wiki.unrealengine.com/Third_Party_Socket_Server_Connection ○ Connect()時に注意点がある 20
TCPの罠: Connectの問題 connectは3Way Handshakeによって接続する 通信待ちが入るので一瞬では終わらない ● ● blocking mode: 完了までconnectは返ってこない non-blocking mode: すぐに返ってくる ○ ○ POSIX: EINPROGRESSのerrorを返す Winsock: 成功(0)を返す Windowsでnon-blocking socketのConnect()からtrueが返ってきても接続は未完了! 完了するまで送信は失敗する 21
TCPの罠: Connectの問題 Non-Blocking Socketで接続完了を知るには? POSIXではselect()を使う UE4ではFSocket::GetConnectionState()が相当する Connect後SCS_Connectedを返したら接続完了 PS4のGetConnectionStateには4.16の時点でBugがある UDNで何人か報告しているので最新のdepoで確認を 22
TCPの罠: Signalの問題 TCP socketで送信関数(send, sendto, sendmsg)を呼び出した時、 通信相手が接続を切断した状態だと、 ● ● POSIX: SIGPIPEのSignalが発生する(抑制されてなければ) Winsock: SOCKET_ERRORを返す (Windows「Signal is 何?」) Signal Handlerが何も設定されていないProcessは異常終了する 23
TCPの罠: Signalの問題 Mac: 4.11で対応 https://www.unrealengine.com/ja/blog/unreal-engine-4-11-released ● Bugfix: Disabled the SIGPIPE signal on BSD sockets to prevent silent program termination on Mac when using network connections. SIGPIPEでEngine Codeを検索してみると ● ● signal(SIGPIPE, SIGIGN)でSIGPIPEを無視 setsockopt()でSO_NOSIGPIPEのOptionを指定して、SocketのSIGPIPEを抑制 24
TCPの罠: Signalの問題 PS4: WebRTCには4.12で対応しているが、BSD Socketは4.16時点で未対応 https://www.unrealengine.com/ja/blog/unreal-engine-4-12-released ● Bugfix: Fixed occasional WebRTC crash on SIGPIPE. SIGPIPEが発生したらcrash不可避。抑制するしかない ● 対応方法 ○ ○ 送信関数のflagにMSG_NOSIGNAL bitを立てる SDK提供の送信APIを使用する UDNには報告されているのでそのうち直るはず 25
64bit値の取り扱い DB indexなど通信時に64bit値が現れる事がある 64bit値はBPでは直接扱えない ● USTRUCT ○ ○ ● DisplayAll, GetAllではやっぱり見えない Replicationはnative code改造しないと無理 FString/FName ○ 変換の取り回し JSON parserの対応 ● 64bit整数として取り出すparserは用意されてない 26
まとめ ● ● ● ● ● Dedicated ServerとListen Serverの特性を考慮して採用検討を 開発段階ではどちらにも対応しておくとmeritがある Application ServerとのREST API通信はPluginがある TCP通信とまつわるBugの対応(Bugは見つけてUDNに報告しましょう) 64bit値とUEの相性 27
ご清聴ありがとうございました ネットワークエンジニア募集しています。 ていうか、エンジニア全般募集しています。 その他職種も絶賛募集中です。 興味があればウェブサイトからご連絡ください。 http://soleilgamestudios.com/ 28
質疑応答 29