Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
REALITYのライブゲームで新しく採用したDGSの話(リアルタイムサーバーの話)
Search
gree_tech
PRO
October 25, 2022
Technology
0
800
REALITYのライブゲームで新しく採用したDGSの話(リアルタイムサーバーの話)
GREE Tech Conference 2022で発表された資料です。
https://techcon.gree.jp/2022/session/TrackC-1
gree_tech
PRO
October 25, 2022
Tweet
Share
More Decks by gree_tech
See All by gree_tech
kustomizeをいい感じに使う方法
gree_tech
PRO
3
830
スケーラビリティとコスト管理 Google Cloud Spanner 費用最適化の取り組み
gree_tech
PRO
0
490
「アナザーエデン 時空を超える猫」の5年前のログを引っ越してデータドリブンで事業運用プロセスを改善した話
gree_tech
PRO
0
340
Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築
gree_tech
PRO
0
780
全社総会における「REALITY Spaces」の活用と、Addressableを用いたコンテンツ配信技術について
gree_tech
PRO
0
450
AWSのEKS環境でログ機能を構築/リリースしたお話
gree_tech
PRO
0
350
「ヘブンバーンズレッド」の大規模アップデートにおける国内及び翻訳QAの取り組み
gree_tech
PRO
0
420
アプリ「REALITY」の12言語対応プロセスの仕組みと品質向上の取り組み
gree_tech
PRO
0
650
REALITYアプリのメンテナンスなしでの機能リリースを実現する、Istio導入とB/Gデプロイ実現の取り組み
gree_tech
PRO
0
530
Other Decks in Technology
See All in Technology
地理空間データ可視化・解析・活用ソリューション Pacific Spatial Solutions (PSS)
pacificspatialsolutions
0
290
現代CSSフレームワークの内部実装とその仕組み
poteboy
7
3.6k
DMM.com アルファ室採用案内資料
hsugita
1
160
リテール金融(キャッシュレス・ネット銀行・ネット証券)の競争環境と経済圏
8maki
0
1.2k
長期間TiDBを使ってきた話 @ 私たちはなぜNewSQLを使うのかTiDB選定5社が語る選定理由と活用LT / Experiences with TiDB Over Time
chibiegg
2
900
Azure犬駆動開発の記録/GlobalAzureFukuoka2024_20240420
nina01
1
220
競技としてのKaggle、役に立つKaggle
yu4u
3
1.8k
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
3
570
チームでロジカルシンキングに改めて向き合っている話 〜学習環境と実践⽅法〜
sansantech
PRO
3
2.6k
APIファーストなプロダクトマネジメントの実践 〜SaaSus Platformでの例〜 / "Practicing API-First Product Management - An Example with SaaSus Platform
oztick139
0
110
ChatworkのSRE部って実は 半分くらいPlatform Engineering部かもしれない
saramune
0
160
レガシーをぶっ壊せ。AEONで始めるDevRelの話 / Qiita Night 2024-2-22
aeonpeople
3
1.3k
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
31
46k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
244
20k
GraphQLとの向き合い方2022年版
quramy
32
12k
Music & Morning Musume
bryan
41
5.6k
The Pragmatic Product Professional
lauravandoore
25
5.8k
A Modern Web Designer's Workflow
chriscoyier
689
190k
How GitHub (no longer) Works
holman
304
140k
Making the Leap to Tech Lead
cromwellryan
124
8.5k
Design by the Numbers
sachag
274
18k
Agile that works and the tools we love
rasmusluckow
325
20k
Thoughts on Productivity
jonyablonski
58
3.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
7
1k
Transcript
ジープラ株式会社 ソフトウェアエンジニア 銭 洋 REALITYのライブゲームで 新しく採用したDGSの話 REALITY株式会社 ソフトウェアエンジニア 山田 達矢
•REALITYとは •REALITYのゲーム •#REALITY釣り部 • DGSの紹介 • 技術概要 • 選定基準・理由 •
クライアントとの連携 • REALITYならではの技術的工夫 アジェンダ 2
3 スマホひとつでアバター作成、ライブ配信による交流やゲームまで楽しめるスマホ向けメタバース アプリ REALITYとは アバター ライブ配信 コミュニケーション ゲーム ワールド
作り方によって2種類に分類可能 REALITYのゲーム 4 • Unityゲーム ◦ REALITYアプリのバイナリに内蔵されている ◦ REALITYアバターをそのまま使える •
Webゲーム ◦ アプリの更新とは別に配信可能 ◦ 3Dのアバターを使うことはできない → どちらのゲームも複数人で遊べ、視聴者もゲームの画面を見ることがで きる
Webでやるゲームか、アバターが出ても会話がメインのゲームだった REALITYのゲーム 5
アバターを使って「ゲーム」をやりたい そこでできたのが
2022年8月24日にシーズン1がリリースされた「#REALITY釣り部」 #REALITY釣り部 7
2022年10月26日(水)にシーズン3が開始! #REALITY釣り部 8
#REALITY釣り部 9 • REALITYの3Dアバターで遊べるUnityゲーム • REALITY初の課金要素有りのゲーム • REALITY初のアバター報酬有りのゲーム • REALITYで初めて独立したリアルタイムサーバーを採
用したゲーム
通常のゲーム開発ではあまり見られない課題がいくつもある 「#REALITY釣り部」技術的な課題 • 配信ゲーム特有の課題 • REALITYの特徴から発生する課題 • 「#REALITY釣り部」の仕様特有の課題
通常のゲーム開発ではあまり見られない課題がいくつもある 「#REALITY釣り部」技術的な課題 • 配信ゲーム特有の課題 ◦ 配信ホスト、コラボ参加者、視聴者とロールが多く、それぞれ実行 するロジックを切り分ける必要がある(※REALITYのゲームでは 映像が配信されるわけではなく、視聴者はロジックを実行して配 信者の画面を再現する) ◦
視聴者の参加タイミングによらずその時点の状態からゲームを視 聴できる必要がある
通常のゲーム開発ではあまり見られない課題がいくつもある 「#REALITY釣り部」技術的な課題 • REALITYの特徴から発生する課題 ◦ 配信中にアバターを変更できるため、ゲームのプレイ中に変更される 場合を考慮しなければならない ◦ 配信中にコラボの出入りが発生することによるプレイヤーの変化に対 応する必要がある
◦ 配信中や視聴中にバックグラウンドにしたり、アプリ終了から復帰した りするユーザーがいることを考慮しなければならない ◦ スマホ向けメタバースなので、通信状況の悪いモバイル回線での安定 性を意識する必要がある
通常のゲーム開発ではあまり見られない課題がいくつもある 「#REALITY釣り部」技術的な課題 • 「#REALITY釣り部」の仕様特有の課題 ◦ 同じ釣り場で複数人が同時に釣りをするので、通信のリアルタイ ム性の高さが求められる ◦ 課金、ランキング機能が存在するので、チート防止としてサー バーで釣りの状態などを管理する必要がある
既存の仕組みで課題を解決できるのだろうか 「#REALITY釣り部」技術的な課題 列挙した通り、通信関係の課題が多い。 既存のゲームで使われている仕組みで解決はできないの だろうか。
既存REALITYゲームの通信の仕組み 「#REALITY釣り部」技術的な課題 コラボ プラットフォーム マルチゲームサーバー ホスト 視聴者 ▼データを中継するためのサーバー マルチゲームサーバーは、ホストから受け取ったデータ をコラボ参加者や視聴者に転送したり、あるいは逆にコ
ラボ参加者のデータをホストに転送したりしてくれる ▼ホストが送ったデータはサーバーにバック アップされる ホストが切断したりアプリ終了したりしてもデータを失わ ないように、ホストが送った最終のデータをサーバーが 保存し、再接続時に受信する仕組みが存在する
釣りに適用すると 「#REALITY釣り部」技術的な課題 コラボ プラットフォーム マルチゲームサーバー ホスト 視聴者 APIサーバー ▼APIサーバーの必要性 課金やランキングがある以上、チート防止のためにサー
バーで釣りを管理する必要がある。 ▼APIサーバーの問題点 • リクエスト時のオーバーヘッドがあるので、遅延が大 きい • 情報を都度DBに保存するので、遅延が増加する 上、サーバー側負荷も高くなりがち • 情報を他人に共有するだけでも、 API→ホスト→マ ルチゲームサーバー →コラボのように複雑な経路に なり、さらに遅延が増加する とにかく遅延が大きすぎる データベース 都度参照する
「#REALITY釣り部」技術的な課題 汎用的なAPIサーバーで釣りの状態を管理しようとすると遅延 が大きく、ゲーム体験を著しく損ねてしまう。 特にホストとコラボ参加者の間で不整合が起きやすくプレイが 困難。 →リアルタイム性が高く、ロジックの実行できるサーバーが必 要
「#REALITY釣り部」技術的な課題 一方で、視聴者はというと ◦ プレイする訳ではないので、リアルタイム性の高さはそこまで大事では ない(音声にも一定の遅延があるので遅れは許容) ◦ むしろ安定性の方が求められる ◦ 配信枠によって人数が読めず、サーバーに接続させる場合はオートス ケール可能な環境が好ましい
→既存のマルチゲームサーバーを使った方が理想的である ・マルチゲームサーバーはPub/Sub方式を採用したオートスケール可能な環境 ・一定時間ごとの情報を送信フレームにしてホストが共有し、あえて遅延させる ことで、安定でなめらかな視聴環境を用意できる
「#REALITY釣り部」技術的な課題 まとめると ゲームプレイヤー:情報を速やかに同期することが最優先 →ロジック実行可能なリアルタイムサーバーとお互いに通信したい 視聴者:同期の低遅延よりも、カクツキが少なく安定していることが優先さ れる。また大人数の視聴に耐える環境が重視される。 →マルチゲームサーバーを利用したい
「#REALITY釣り部」技術的な課題 以上のことから、次の構成に決定 DGS コラボ PF Multigame Server ホスト 視聴者
TCP Socket ▼リアルタイム通信専用のサーバーを用意 ゲーム中のリアルタイム通信を専用サーバーにすること で、高レスポンス、高効率の通信に。 ロジックが実行できるので、釣りの状態も管理可能。 APIサーバーと比べDBアクセスの頻度が低く(ゲーム終 了時などにまとめてDBアクセスする)、遅延の要因も削 減される。 WSS ▼視聴は従来のまま 配信ホストがゲームのデータを一定時間分 まとめて送信フレームにして視聴者に共有。 視聴者はバッファーに一定の受信フレーム が溜まったところで再生することで安定した 視聴が行える。大人数接続の耐性もある。
「#REALITY釣り部」技術的な課題 まだ問題は残っている コラボ DGS ホスト コラボ 配信A コラボ DGS
ホスト コラボ 配信B ▼DGSのインスタンス生成、消去 配信で釣りを遊ぶごとに、専用のDGSインス タンスを生成する必要があり、終了する場合 にはリソースを解放して再利用可能な状態 にする必要がある。また、すぐにプレイできる ように、事前に必要な処理を済ませた待機 中のインスタンスをいくつか用意しておきた い。 ▼使用中DGSの保護 雑にオートスケールの設定を入れたり、手動 でスケールインしたりすると、使用中のイン スタンスを誤って終了する可能性がある。 ▼接続先DGSの割りあて 同じ配信で遊んでいる人は同じサーバーに 接続しなければならない。正しく同じサー バーに振り分ける必要がある。
「#REALITY釣り部」技術的な課題 ▼DGSのインスタンス生成、消去 配信で釣りを遊ぶごとに、専用の DGSインスタンスを 生成する必要があり、終了する場合にはリソースを解 放して再利用可能な状態にする必要がある。また、す ぐにプレイできるように、事前に必要な処理を済ませた 待機中のインスタンスをいくつか用意しておきたい。 ▼使用中DGSの保護 雑にオートスケールの設定を入れたり、手動でスケー
ルインしたりすると、使用中のインスタンスを誤って終 了する可能性がある。 ▼接続先DGSの割りあて 同じ配信で遊んでいる人は同じサーバーに接続しなけ ればならない。正しく同じサーバーに振り分ける必要が ある。 この辺をいい感じにやってくれる
「#REALITY釣り部」で使っているAgones Fleet Agones System (FleetAutoScaler) DGS Allocated DGS Allocated ・
・ ・ DGS Ready DGS Shutdown ▼Fleet Fleetは、ここでいうDGSのセットのようなもの。 主要な状態として、Ready・Allocated・Shutdownがある。 FleetAutoScalerにより、オートスケールが行われる。
「#REALITY釣り部」で使っているAgones Fleet DGS Allocated ・ ・ ・ DGS Ready DGS
Ready Fleet DGS Allocated ・ ・ ・ DGS Allocated DGS Ready Fleet DGS Allocated ・ ・ ・ DGS Allocated DGS Ready DGS Ready 割り当て要求時に、Readyのサーバーを Allocatedにしてクライアントと接続させる Readyの数が常に一定( Buffer Size)になるよう に、割り当て後には新規でインスタンスが立ち上が る Buffer Size Buffer Size
「#REALITY釣り部」で使っているAgones Fleet DGS Shutdown ・ ・ DGS Ready DGS
Ready Buffer Size Fleet ・ ・ ・ DGS Ready DGS Ready Buffer Size 使用完了したShutdownのサーバーは削除されるが、Allocatedはオートス ケールから保護される。 DGS Allocated DGS Allocated
「#REALITY釣り部」で使っているAgones Agones System ① ② Dedicated Game Server Pod (GameServer)
API Server ③ ④ ⑤ ⑥ ▼ゲームを開始するまでの処理 ①クライアントからAPIサーバーにDGSの割 り当てを要求 ②APIサーバーからAgones SystemにDGS の割り当てを要求 ③Agones SystemがDGSの割り当て (Allocate)を行う ④⑤Agones SystemからAPIサーバーを経 由して接続先のホスト名とポート番号をクラ イアントに通知 ⑥クライアントがDGSに接続
DGSとクライアントの連携の話 このDGSの仕組みを クライアント側でどう対応、反映しているか
DGSとクライアントとの連携 DGSから受け取ったイベントを元に実行していく 1. 魚の出現 2. 魚とのバトル・ファイトの開始 3. 釣果の表示 4. イベントの実行
DGSとクライアントとの連携(個別の釣り) 1. DGSからイベントを送る a. ゲームの開始 b. イベントの開始通知 c. イベントの終了通知(厳密には終了イベントの開始通知) d.
魚影の移動情報、形の情報 2. クライアントからDGSにイベントを送る a. 魚が餌に食いついた b. 魚とのバトルの開始リクエスト
DGSに送ってそうで送っていないもの 1. ウキの現在位置 2. 現在のアバターのアニメーションの情報 3. UIの開いている情報 4. 持っているメダルの情報 これらはマルチゲームサーバで管理している
釣りの成功判定 1. 魚の移動情報はDGSで管理しているがウキはDGS管理していな い 2. 食いつきの判定はクライアント側で判定 3. DGSはクライアントからつついたことを受け取りステータスの更 新。つつきの成功をクライアントに送る 4.
クライアントはつつきが成功していたらタップでヒットができる 5. DGSはヒットを受け取ったらバトルの開始イベントを送る
食いつきからバトルまでの流れ 釣り人 DGS 食いついた! 釣り人 DGS 食いついてOK! 釣り人 DGS タップした!
釣り人 DGS バトル開始!
なぜこのようにしているか 1. サーバで管理している魚の位置は、あくまで「次の移動先」をやっ ているにすぎない 2. ラグなどによりサーバで見ている魚の情報とクライアントの情報は ずれることがある 3. 見た目的なところはクライアントに任せ、DGSでは整合性が取れ ているかを確認する
a. 特に他の人と同じ魚を釣ろうとしていないか、などをチェックしている
DGSとクライアントとの連携(全体イベント) 1. DGSからイベントを受け取ったら、クライアント側は受け取ったと いうメッセージ(pop)をDGSに返す 2. これによりDGSでは接続が担保されたとみなし次のイベントを実 行する ではクライアントが受け取ったメッセージを返せなかったら?
REALITYならではの技術的工夫 1. REALITYのアプリは画面配信では無い 2. バックグラウンドに行った際にマイクなどは動くがUnity部分は動 かない 3. なのでバックグラウンド中の釣りのイベントを補完する必要がある 4. そのためにDGSのイベント制御を細かく行っている
REALITYならではの技術的工夫 1. REALITYは配信アプリ 2. 視聴者がリアルタイムで配信を見にくる 3. コラボ参加をする他の配信者もいる いつ、誰が配信を見に来ても、抜けても動作の担保が必要!
視聴者・コラボ配信者の工夫 REALITYには配信を見る視聴者と、一緒に参加するコラボ参加者が いる ・視聴者はいつ入ってもゲームを見れる →どのタイミングであってもゲームの再現をする必要がある ・コラボ参加者はいつでも抜けられる →ホスト以外の誰がいつ抜けてもゲームの動作を担保する必要があ る
ゲームの視聴者 1. DGSはホストが受け取った情報を視聴者に流すようにしている 2. 視聴者はDGSに接続はしていない 3. DGSの負荷としてはゲームに参加している人のみ ホスト コラボ 視聴者
DGS
コラボ参加者の接続が切れた場合 1. コラボ参加者はDGSに接続し、メッセージを受け取ったらpopを 返す 2. 全員がpopをするまでDGSでは次のイベントを送らない 3. コラボ参加者が途中で抜けた場合、DGSではその人をpop済とし て扱う コラボ参加者は途中で抜けてもゲームが進む
ホスト コラボ 視聴者 DGS
コラボ参加者が途中で抜けた場合 1. popができなくなる 2. 接続が切れたことをDGSが検知 3. REALITY配信アプリからの退出のイベントから接続情報をアップ デート 4. そのプレイヤーが復帰することを想定しつつもイベントは進む
ホスト コラボ 視聴者 DGS pop しとこう
ホストが途中で抜けた場合 1. DGSとのやりとりができなくなる 2. ホストの復帰をDGSは待つ 3. ホストが復帰したら再開 ホスト コラボ 視聴者
DGS ホストの 復帰を 待とう
演出の再生の同期 1. 演出を再生して次のイベントに行く際にバックグラウンドなどにい て演出が見れないプレイヤーが想定される 2. イベントを開始していいかをプレイヤーに通知し、プレイヤー全員 の準備が整っているかをpopイベントで受け取る 3. DGSは全員からイベントのpopを受け取ることでイベントの開始 をスタートする
4. その間は他のプレイヤーは釣りに関わる操作ができない これにより重要なイベントは取り残されることを防げる
イベントの流れのまとめ ホスト コラボ 視聴者 DGS ホスト コラボ 視聴者 DGS ①このイベント再生して
OK? ③全員OK! 再生する ね! ②OK! ②OK!
まとめ 1. DGSを使うことで配信ごとにゲームのインスタンスサーバを立て られる 2. クライアントから必要な情報は別途送ることが可能 3. ユーザ一人一人を管理して途中の入退出を管理 DGSはいいぞ!
45