Skip to main content
大規模ゲーム開発における
build 高速化と安定化
ゲーム・エンターテインメント事業本部Japanリージョンゲーム事業部
田辺 哲 (Tanabe Satoru)
DeNA TechCon 2018
自己紹介
• 田辺 哲 (Satoru Tanabe)
• プロフィール
• 前職は SIer で金融系システム開発に従事
• 2011 年に DeNA に入社し 、ngCore 立ち上げプロジェクトへの参画を経て、
Mobage Platform などの開発に従事。
• 現在は Unity で内製 3Dアクションバトルの開発に携わり、アクションバト
ルの開発からバックエンドシステムの最適化まで幅広く取り組んでいる
1
アジェンダ
• 大規模・複雑化するスマートフォンゲーム開発の課題
• Build を高速化して課題を解決 (Unity・Jenkins)
• サーバレスアーキテクチャが主流の中で、最適なデータマイグ
レーションを
• 大規模開発に適した git ワークフロー
2
大規模・複雑化する
スマートフォンゲーム開発の課題
3
大規模・複雑化するスマートフォンゲーム開発の課題
• ライトからコアユーザーも遊べる複雑なゲームスキーム
• グラフィックスも 2D から 3D へより高品質へ
• 複数の Game イベントを週替わりでリリース
4
コンテンツ・
Asset 大容量化
Build 時間が
膨大
毎日QAを
回せない
品質が悪い
↓
お客様に満足して
ゲームをPlay
してもらえない
Build 高速化は非常に価値がある
5
Build を高速化して課題を解決
6
次のようなアプローチで高速化した
1. Unity プロジェクトのリポジトリをキャッシュ
2. AssetBundle の差分 Build
3. 分散・並列 Build
4. その他
• スペックが高いマシンで build しているか
• 対象ノードでウィルススキャンが実行されていないか
2、3 について
Unity・Jenkins を中心に
実践を交えて紹介したい
最大のボトルネックは Unity AssetBundle Build
差分 build で高速化しよう
7
Unity AssetBundle Build 高速化方法
8
1. 一度 build した AssetBundle ファイル(.unity3d)と、同時に
生成される Manifest ファイルを git で管理する
• e.g) foo_asset.unity3d foo_asset.unity3d.manifest
• Unity 側で、Manifest ファイルを見て高速化してくれるため
2. Asset は更新すべきファイルだけ、差分で build する
• UnityEditor.BuildPipeline.BuildAssetBundles() を Call するとコストが掛かる。AssetBundle 対象となる
フォルダ単位で実ファイルのハッシュ値を計算し、更新すべきファイルだけ差分で build すべき
3. しかし、フォルダの差分を検出するのは単純ではない
• → フォルダに含まれる Asset が、別のフォルダの共有 Asset に依存しているから
4. 共有 Asset も含めフォルダの差分を検出するにはどうすればよ
いか、がポイントになる
EditorUtility.CollectDependencies() 使う事で、
共有 Asset も含めフォルダの差分を検出できる
(Unity 公式 API)
Unity AssetBundle で差分 Build する方法
9
※ サンプルコード
https://goo.gl/iJLBkH
Asset が依存する全ての Asset ファイル
フォルダ内の全ての実ファイル
ハッシュ値が計算出来る
AssetBundle 対象フォルダ配下の各種 Asset
Unity AssetBundle Build 高速化の効果
No 処理内容 概算所要
時間(秒)
1 Full build 145
2 unity3d / unity3d.manifest ファイルを git 管理して再利用 54
3 AssetBundle 対象フォルダ単位でハッシュ値を計算し差分 build
※ハッシュ値は git 管理
7
4 No3 を 4 プロセスで並列実行 3
10
検証用の Asset (約 1900 ファイル) を使い、60 ファイルの AssetBundle
build (unity3d を生成) を生成した際の効果測定
• Asset 一式 は実キャラクタを利用し、Prefab / Texture / FBX / ScriptableObject / Material / Animation 等が
含まれる
• 測定PC : Unity5.4.5 / Mac OSX / CPU:4GHz Intel Core i7 / メモリ 16GB / フラッシュストレージ 500GB
• 前提として効果測定中 Asset に変更が無いものとする
Jenkins を活用した分散・並列 Build
11
Jenkins
Master/Slave
全体構成
12
膨大な時間
が掛かるの
で分散させる
時間が掛か
る上、並列
実行すると
不整合が
開発A 開発B 開発C 開発D
Jenkins - Platform 毎に分散 Build
13
• Build Flow Plugin の parallel ブロックを使う事でノード毎に分
散・並列実行できる
• 実行ノードの制御は NodeLabel Parameter Plugin を利用
• 下記は Job1 / Job2 を分散・並列 build しつつ完了を待ち合わせる例
• また、Node毎に同じJOBは同時に1つだけ実行するようにしたい
場合は、Throttle Concurrent Builds Plugin が使える
•
ノード毎に並列実行したいが、
同一JOBは同時に一つだけ実行
するように制御
Jenkins – 同一開発 branch で排他制御 ①
14
• Master を扱う処理は、同一開発 branch で安易に分散・並列
build すると不整合が起きる
• 開発ブランチ単位で排他制御しつつ並列実行、高速化が必要
• Groovy でコードを書いて排他制御できる
Jenkins –
同一 branch で排他制御 ②
15
実行中のJOBのパラメー
タを確認して wait する
※ サンプルコード
https://goo.gl/Ykw1jW
16
→ データマイグレーションの最適化・徹底した自動化が必要
DeNA のゲーム開発は Sakasho を使い
サーバレスアーキテクチャが主流に
4つのフェーズ
でマイグレー
ションを最適化、
自動化を徹底
17
手動で Merge、
コンフリクト解消
も大変
「マージ祭り」JOB導入
merge 作業を自動化、
人為的なコンフリクト
以外は自動的に解消
手動でデータ更新
不整合が起きる
データ Migration
を徹底して自動化
(Gacha / Inventories /
Achievement / Ranking/
LoginBonus....)
18
1. パラメータを設定する
だけで使い回せるよう
共通化
2. コケた JOB から容易
に再実行(時にはス
キップしたいJOB も
ある)
3. cron で時間起動する
マイグレーションを自動化する
JOB インターフェース
大規模開発に適した git ワークフロー
19
大規模開発に適した git ワークフロー
1. エンジニア以外も全員 git を使う
2. エンジニアを介さずに、pull request を merge 出来るまで
ワークフローを熟考する
• 危険なデータが merge されない仕組みを考え抜く
• Texture / Animation / FBX / 各種定義ファイル… 全ての
Asset は Import する際に、チェックして所定の場所に配置
• キャラクタ、Map、クエスト などもパラメータから自動生成
• Master は Jenkins JOB でスプレッドシートから、自動pull
request
3. 事故が起きたら、エンジニアが責任を持って振り返る覚悟でやる
20
まとめ
• 大規模化するスマートフォンゲーム開発・運用も、絶えず
改善する事で安定化できる。
• 様々な改善策は毎日考え続けることで、ある日パッと良い
案が降ってくる。粘り強さが必要。
• スマートフォンゲームはまだまだ大規模化する。お客様へ
さらなる Delight を届けるために、我々は走り続けなけれ
ばならない。 21