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を置く必要は無い
Listen Server
local player処理も
する
Client
Client
Client
Client
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
○ https://wiki.unrealengine.com/JSON_Query
✗ License未記載!
● VaRest
○ 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

UE4 MultiPlayer Online Deep Dive 実践編2 (ソレイユ株式会社様ご講演) #UE4DD