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
Unity+AWSによるマネージドなゲームサーバ運用
Search
Miyori Kobata
November 20, 2019
Programming
2
26k
Unity+AWSによるマネージドなゲームサーバ運用
Amazon Game Developers Conference
Miyori Kobata
November 20, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
620
情報漏洩させないための設計
kubotak
3
520
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
110
CQRS+ES の力を使って効果を感じる / Feel the effects of using the power of CQRS+ES
seike460
PRO
0
150
nekko cloudにおけるProxmox VE利用事例
irumaru
3
450
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
350
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
910
毎日13時間もかかるバッチ処理をたった3日で60%短縮するためにやったこと
sho_ssk_
1
250
Go の GC の不得意な部分を克服したい
taiyow
3
820
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
290
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
140
Exploring: Partial and Independent Composables
blackbracken
0
100
Featured
See All Featured
Bash Introduction
62gerente
609
210k
The Cult of Friendly URLs
andyhume
78
6.1k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
66k
Making the Leap to Tech Lead
cromwellryan
133
9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
450
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Imperfection Machines: The Place of Print at Facebook
scottboms
266
13k
Statistics for Hackers
jakevdp
796
220k
A better future with KSS
kneath
238
17k
Transcript
Unity+AWSによる マネージドなゲームサーバ運用 株式会社ミクシィ 小端みより
◦ 小端みより / ゲームエンジニア ◦ コンシューマゲーム業界から株式会社ミクシィに入社し、 複数タイトルの開発に携わる (すべてオンラインマルチプレイ対応) (C) mixi,
Inc. All rights reserved. 2 自己紹介
新作オンラインマルチプレイのゲームを開発中 (C) mixi, Inc. All rights reserved. 3 現在も・・
(C) mixi, Inc. All rights reserved. 4 まずはじめに
◦ Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~ というテーマで講演をさせて頂きました https://learning.unity3d.jp/3341/ ◦ Unityで本格的なオンラインマルチプレイのアクションゲーム 開発のためのゲームサーバを実装し運用するという内容 (C) mixi,
Inc. All rights reserved. 5 UniteTokyo2019では
別のスライドに移動します (C) mixi, Inc. All rights reserved. 6 講演内容の振り返り
◦ チート耐性および通信の安定性や実装がシンプルになる などの理由からサーバ集中処理型の設計を採用した しかし必然的にネットワーク遅延の影響が大きくなるため ◦ 極力安定した高品質なインフラ環境が必要となる ◦ となると運用コストも高騰する懸念がある (C) mixi,
Inc. All rights reserved. 7 講演の要約としては
Amazon GameLiftを使えばすべて解決・・!? (C) mixi, Inc. All rights reserved. 8 そんな懸念も
(C) mixi, Inc. All rights reserved. 9 GameLiftについて
ゲームサーバ運用に特化されたマネージドサービス ◦ サーバをデプロイするだけでプロセスの起動や監視、 スケーリングなどもすべてやってくれる ◦ AWSのインフラを使用するので低レイテンシかつ高信頼な 通信環境を実現できる ◦ しかも使い方次第で運用コストも抑えられる・・?? (C)
mixi, Inc. All rights reserved. 10 GameLiftとは
GameLiftはふたつのゲームサーバ方式に対応している ◦ 「リアルタイムサーバ」(新機能) JavaScriptによる簡易的な実装 ◦ 「カスタムゲームサーバ」 従来型のゲームサーバで、本格的なゲーム開発に適する (C) mixi, Inc.
All rights reserved. 11 まず
GameLiftはふたつのゲームサーバ方式に対応している ◦ 「リアルタイムサーバ」(新機能) JavaScriptによる簡易的な実装 ◦ 「カスタムゲームサーバ」 従来型のゲームサーバで、本格的なゲーム開発に適する 今回はこちらを扱います! (C) mixi,
Inc. All rights reserved. 12 まず
1. GameLift Server SDKの導入 ↓ 2. GameLiftへサーバをデプロイ ↓ 3. GameLift上のサーバを利用する
(C) mixi, Inc. All rights reserved. 13 大まかな導入手順
(C) mixi, Inc. All rights reserved. 14 GameLift Server SDKの導入
◦ まず前提として Unityで動作するサーバ実装が存在するものとする ◦ Amazon GameLift ServerSDKをダウンロード https://aws.amazon.com/jp/gamelift/getting-started/ ◦ SDKに含まれるC#版SDKをビルドし、出力されたDLL群を
Unityプロジェクトにインポート (C) mixi, Inc. All rights reserved. 15 サーバSDKを導入するには
◦ 自前のサーバのコードから、GameLift ServerAPIの呼び出し やコールバック処理への対応を行う ◦ 具体的には、サーバ起動時にSDKの初期化やプロセス起動の 通知(その際に使用ポートなどのパラメータも渡す) セッション開始やヘルスチェックのコールバック処理など ◦ 詳しくはSDKドキュメントを参照
https://docs.aws.amazon.com/ja_jp/gamelift/latest/developerguide/gamelift-intro.html (C) mixi, Inc. All rights reserved. 16 SDKの繋ぎ込み
◦ この手のAPIのコールバックは別スレッドから行われる ◦ が、Unityライブラリは基本的にUnityメインスレッドでのみ 呼び出される前提で設計されている(Debug.Logなども!) ◦ つまりコールバック処理内でUnityのコードを使用したい場合 外部スレッドからUnityメインスレッドへDispatch処理を行う 必要がある (C)
mixi, Inc. All rights reserved. 17 コールバック実装の注意点
UnitySynchronizationContextを使いましょう! (C) mixi, Inc. All rights reserved. 18 解決策としては・・
◦ Unityメインスレッド内から mSyncContext = SynchronizationContext.Current; といった感じでUnitySynchronizationContextを保存しておく ◦ 他スレッドから呼び出されるコールバック関数では mSyncContext.Post(MyCallback, params);
とすれば、後ほど”MyCallback”がUnityメインスレッド内で 実行される (C) mixi, Inc. All rights reserved. 19 SynchronizationContextの使用例
◦ Unityでサーバをビルドする際、GameLiftそのものはWindows およびLinuxをサポートしているのでどちらかを指定 ◦ ただし運用コストや効率性の観点からはLinux版ビルドを使用 する事が望ましい (後記するフリートの初期化処理はLinux版のほうが早い) (C) mixi, Inc.
All rights reserved. 20 次はサーバのビルド
◦ 通常のLinuxEC2インスタンスではGPUをサポートしていない ◦ が、UnityはゲームエンジンなのでGPUを使用しようとして EC2上でサーバを起動しようとするとクラッシュ! ◦ というのを避けるためサーバビルド時はheadlessモードに 例)buildOptions += BuildOptions.EnableHeadlessMode;
(C) mixi, Inc. All rights reserved. 21 ビルド時の注意点
(C) mixi, Inc. All rights reserved. 22 GameLiftへサーバをデプロイ
ゲームサーバがビルドできたとして、このバイナリデータを どうやってGameLiftにデプロイするのか・・? (C) mixi, Inc. All rights reserved. 23 デプロイするには・・?
◦ AWS CLI(コマンドラインツール)を使用する https://aws.amazon.com/jp/cli/ ◦ 設定手順に関しては省略・・デプロイするときはこんな感じ 例)aws gamelift upload-build --operating-system
AMAZON_LINUX --build-root C:¥github¥hogehoge¥Build --name “HogeServer" --build-version “123" (C) mixi, Inc. All rights reserved. 24 AWS CLIを使います
こんな感じでビルドの一覧に追加されるので、これを基にして フリートを作成する (C) mixi, Inc. All rights reserved. 25 デプロイされると・・
ビルドの一覧から使用するビルドを選択し、 ”ビルドからフリートを作成” を選択すると次の画面に進む (C) mixi, Inc. All rights reserved. 26
フリートの設定
ようするにビルドに紐づいたEC2インスタンス群 単一EC2インスタンス上で複数のサーバプロセスが起動される またスケーリングが行われる場合はEC2インスタンス単位 (C) mixi, Inc. All rights reserved. 27
ところでフリートって? ビルド フリート EC2 EC2 EC2 プロセス プロセス プロセス
◦ オンデマンド 通常のEC2インスタンスを使用する ◦ スポット AWSの余剰EC2インスタンスを使用するので 大幅にランニングコストを節約できる(最大で90%とか!) (C) mixi, Inc.
All rights reserved. 28 フリートタイプとは?
◦ 高性能なインスタンスほど同時に多くのプロセスを起動する ことができる ◦ 高性能なほどコストも高くなるのでそこはまあバランスで (C) mixi, Inc. All rights
reserved. 29 EC2インスタンスタイプとは?
サーバプロセスの起動設定 ポート開放設定 主要な設定はそんなところ・・・ (C) mixi, Inc. All rights reserved. 30
その他の設定
EC2インスタンスの初期化と、サーバプロセスの起動を行い それが正常に動作するかどうかチェックが行われる 完了するとこんな感じで利用可能に (C) mixi, Inc. All rights reserved. 31
フリートが作成されると
(C) mixi, Inc. All rights reserved. 32 GameLift上のサーバを利用する
GameLift上でサーバプロセスを起動できたけど ゲームクライアントからどうやって利用する・・? (C) mixi, Inc. All rights reserved. 33 さて・・
◦ AWS SDKのGameLift ServiceAPIを使用する必要がある CreateGameSession、CreatePlayerSession、SearchGameSessions など ◦ AWS SDKはC#版も提供されているので、Unityから直接APIを 利用できなくはないが・・
◦ SDKの相性問題 & そもそもセキュリティ上望ましい使い方で ないのでおのおのでバックエンド実装を行うことが望ましい (C) mixi, Inc. All rights reserved. 34 AWS SDKを使用する
面倒くさそうじゃん、、、、 (C) mixi, Inc. All rights reserved. 35 でもバックエンド実装って・・
◦ AWS Lambdaを利用し関数を実装すればインフラを意識する ことなくバックエンド実装できる ◦ しかもLambdaは言語としてRubyやPythonだけでなくC#も 使用可能なので、サーバエンジニアの手を煩わせることなく プロトタイピングを行えます (C) mixi,
Inc. All rights reserved. 36 手軽な方法としては
◦ AWS Toolkit for VisualStudio https://aws.amazon.com/jp/visualstudio/ を使うとVisualStudioで実装したLambda関数を直接AWSに デプロイ&テストできて非常に捗ります (C) mixi,
Inc. All rights reserved. 37 VisualStudioプラグインもある!
◦ Amazon API Gatewayと組み合わせることで、 作成したLambda関数をREST APIとして使用できる ◦ クライアントからこのAPIを叩けばサーバのアドレスや ポート番号をJSONで取得できるので、あとは接続するだけ! (C)
mixi, Inc. All rights reserved. 38 そして
(C) mixi, Inc. All rights reserved. 39 そのほか
◦ GameLiftにはサーバログを保存する機能がある (ゲームセッション単位で保存&取得できる) ◦ せっかくなのでUnityのDebug.Log系の関数で出力された ログをここに出力したい (C) mixi, Inc. All
rights reserved. 40 Debug.Logのサーバログ化
void Init() { string path = Path.Combine(Application.dataPath, Guid.NewGuid().ToString("N") + ".log");
var stream = new FileStream(path, FileMode.CreateNew, FileAccess.Write); mLogFileWriter = new StreamWriter(stream, System.Text.Encoding.UTF8); mLogFileWriter.AutoFlush = true; Application.logMessageReceived += LogCallback; GameLiftServerAPI.ProcessReady(new ProcessParameters() { (省略) LogParameters = new LogParameters(new List<string>() { path }) }); } void LogCallback(string condition, string stackTrace, LogType type) { mLogFileWriter.WriteLine($"{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")},{type.ToString()},{condition}"); } (C) mixi, Inc. All rights reserved. 41 実装例
Unityのログ出力イベントをフックしそれをファイルに出力した 上で、GameLiftの初期化時にログファイルのパスを渡すと GameLiftによりそれが自動で収集される、ということ (C) mixi, Inc. All rights reserved. 42
解説
(C) mixi, Inc. All rights reserved. 43 まとめ
◦ UnityとAWSを組み合わせることによってオンラインマルチ プレイゲームを比較的お手軽に開発&運用することができる ◦ 本格的なオンラインマルチプレイ開発の敷居が下がることで、 今後より新しいゲーム性を持つタイトルが生まれてくる 可能性を感じる (C) mixi, Inc.
All rights reserved. 44 まとめ
(C) mixi, Inc. All rights reserved.