Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

大規模ゲーム開発における build 高速化と安定化

26,028 views

Published on

DeNA TechCon 2018の登壇資料です。

Published in: Technology
  • Be the first to comment

大規模ゲーム開発における build 高速化と安定化

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

×