ゲームエンジン開発を支える技術

1,042
-1

Published on

Game Creators Conference 2016の講演で使用したスライドです。
『最新のゲームエンジン開発を支える技術』 - 是松 匡亮 / 齊藤 俊介

Published in: Technology
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,042
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
11
Embeds 0
No embeds

No notes for slide
  • おはようございます。
    朝早くからお集まりくださり、ありがとうございます。

    Game Creators Conferenceは初の開催ですので すこしばかりアナウンスをさせてください。
    このセッションは E704 で開催されている 『ゲームエンジン開発を支える技術 – CIの使い方とWebサービスの提供』です。

    株式会社Aiming やまふじ たかし様のご講演 『剣と魔法のログレス MMOの継続的な改善と運用』 は E705 の部屋で
    株式会社スクウェア・エニックス はやし たける様のご講演 『ゲームエフェクト制作の現状報告』 は E703 の部屋で
    それぞれ開催されておりますので、間違って来てしまった場合は今なら移動できます。ラストチャンスです。

    では、はじめましょう。
  • このセッションでは 株式会社カプコンで開発を進めている 新しいゲームエンジンの開発環境について 取り扱います。

    カプコンのゲームエンジンと言えば MT FRAMEWORK でしたが 新しいゲームエンジンは MT FRAMEWORK とは全く異なるエンジンです。
    昨年のCEDECで講演をした資料は CEDEC Digital Library から入手できますので ご興味のある方はご覧ください。
  • 第一部では、『CIの運用とWebサービス』をご紹介します。

  • アジェンダです。

    CIの導入 CIの現状の運用 CIへ開発者を導くために採用している手法 最後にWebサービスの提供

    となっています。

    参加されている皆様がどのような背景を持っていらっしゃるのかわかりませんので
    今回は カプコンのゲームエンジン開発現場を丸裸にします

    そのうえで ご質問やお気づきの点がございましたら ぜひお教えください。

  • CI つまり 継続的インテグレーションの必要性は今更語ることでは無いかもしれませんが

    カプコンで過去にどのようなことが起きていて どのようにCIを使うようになったのか ということについて少しだけお話します。

  • [スライドを読み上げる]

    ゲーム開発現場において あってはならないものです。

    個人の注意力にすべてを委ねていた時代ですね。
    そこで 深夜に自動ビルドをするbatが作成されました。
  • 深夜のビルドですので エラーは 1日に1回しか検出されません。

    実行テストは行いませんでした。
    つまり ビルドが通ったとしても 起動するかどうかは検査できませんでした。
    そのため ビルドしたバイナリは全て捨てていました。

    さらに、CIの重要性を今ほどは認識できていなかったので PCは1台のみでした。


    実施前よりもビルドが通りやすくなりましたが ビルドが通らずにほかの人が困るという状況は 依然として発生していました
    これは なんとかしなければなりません
  • 次に何をするのか考えた結果 このような要求が出てきました。

    [スライドを読み上げる]

    これらの機能は自作できますが、通常業務と掛け持ちだったので背伸びをすることは諦めました。
    そこで出会ったのが、CIツールです。
  • CIツールを用いることで、先に挙げた要求は簡単に実現することができます。

    カプコンではJenkinsを採用することにしました。

    あまり他のCIツールと比較検討したわけではないのですが、
    採用理由としては プラグインによる機能拡張が容易であること
     日本語の情報を入手しやすいこと
    そしてなにより やりたいことが実現できたこと が挙げられます。
  • これまでが Jenkinsを用いるようになった 簡単な歴史でした。

    ここからは 現在の運用についてお話します
  • コミットのフロー全体はこのようになっています
  • 開発者がコードをコミットすると
  • リポジトリがCIへ通知を行います
  • テストエラーで差し戻されるケースが1日あたり5回ほどある計算になりますが、
    これは日によって大きく変わります。仕様変更を入れる場合は発生しがちですが、常日頃から同じというわけではありません。
  • 非侵入的にテストを行うため、ユーザーが行う作業とテストの見分けをつけることが難しくなっています。
    これによって、テストを故意/過失によってすり抜ける可能性を減らしています。
  • テストエラーで差し戻されるケースが1日あたり5回ほどある計算になりますが、
    これは日によって大きく変わります。仕様変更を入れる場合は発生しがちですが、常日頃から同じというわけではありません。
  • 全体をまとめると、このようになっています。
  • Jenkinsではテストとビルドで結果閲覧ページのレイアウトが変化するため、
    慣れていない人からすると非常に混乱しやすい
  • CIのエラーは 別枠扱いで表示しています。

    CIのリセットボタンは気休め程度です。
    同一内容のジョブを再発行するだけですが、安心感を与えることができます。
  • メール通知の際はエンジン開発のフローに組み込まれたとは言い難い
  • 開発中タイトルの情報が漏洩すると会社に致命的な影響が出るため 社内から社外のサービスへファイルをアップロードすることは

  • スライドを共有するサービスです。

    プレゼンテーションとしての利用よりも エンジンの解説資料をマニュアルに埋め込む用途で使われることが多いです。
  • オンラインコンパイラです。
  • シェーダーコードを共有するためのサービスです。
  • コミットからエンジン配布までをおさらいします。
    基本的には、一部で説明されて内容ですので、
    一部の資料をご覧ください。
  • 常にエンジン利用者の必要とするエンジンは、全部の機能入りのマスターエンジンとは限らず
    利用者ごとに提供するエンジンを変える必要があります
  • 複数構成の実現に、それぞれの要望毎にブランチを切った場合の説明です。
    エンジン開発者のメンテナンスコストが上がることを話します。
  • 複数構成のデプロイでは、エンジン開発者はトランクにコミットするだけで、
    CI側で各要望毎のエンジンを生成して配布します。
  • 複数構成のデプロイで行う主な処理です
  • 具体的な構成の切り分け方法を説明します。
    基本はマクロでの
    #define
    定義で処理が切り替えられるよう、あらかじめエンジンを組んでおく必要があります。
    CI側は、それぞれの構成に必要なマクロ定義を追加し、切り分けを行います。
  • 必要な構成設定の設定方法を示します。
    画像のようなツールを使って、MongoDBにデータを保存します。
  • エンジン開発者のコミット時には、
    MongoDBからCIで処理を行う必要がある構成を全て取得し、
    その構成の数だけジョブを発行します。
  • それぞれの構成ごとに発行されたジョブで、
    ジョブのワークスペースにてコードの自動生成、設定ファイルの書き換えを行います。
    また、エンジン利用者にはあらかじめMongoDBに登録されているそれぞれの利用者が欲している構成の情報を元に、
    個々の利用者にエンジンを配布します。
  • 弊社では、エンジンに関係する多くのツールを作成していますが、
    そのツールの中にはエンジン側のコードをソリューションに含めているツールがあります。
    その、エンジンのコードに依存しているツールは、
    依存先のコードの更新に合わせて、アップデートしていかなければなりません。
    ビルド後イベントで更新をしても良いのですが、
    毎回エンジンのビルドのたびにツールのビルドまでしてしまうので、ビルドの時間が延びます。
    また、更新したツールをコミットしてもらう必要がありますが、
    エンジンビルドの裏で走る自動ビルドですので、
    コミット漏れが発生する可能性もあります。
  • そこで、現状ではエンジン開発者のコミット時に、
    ツールが依存してるコードがコミットされているかをチェックし、
    されていたら自動的にツールをビルドしてコミットするようにしています。
  • エンジンのクラッシュ時にはスタックトレースなどの情報を収集してサーバーに送信しています。
    基本的には、一部で説明されて内容ですので、
    一部の資料をご覧ください。

    ただし、エンジン利用者の環境では、必ずしもクラッシュ時の情報収集に必要なDLL等が存在しないことがあり、
    解析に失敗してしまうことがありました。

  • ですので、クラッシュ時にはユーザー側では単純にダンプファイルのみを生成してサーバーにアップロードし、
    サーバーに送信するためのデータの解析はCIマシン上で行っています。
  • エンジンは、複数のプラットフォーム、複数のビルド構成、複数構成のデプロイ、複数のシーンで処理が変わってきますが、
    全部のシーンのパフォーマンスを監視するのは大変です。
  • 処理の変化を簡易的に見れるWebページと、
    より詳細に閲覧できるプロファイルデータを生成します。
  • エンジン側のビルドエラーのフローをおさらいします。
    基本的には、一部で説明されて内容ですので、
    一部の資料をご覧ください。
  • エンジン開発者とエンジン利用者のバージョン管理は分離しています。
    また、エンジン利用者側のプログラマは出来るだけ高速なイテレーションで作業したいのと、
    アーティストにビルドエラー状態の環境が配布されるとアーティストでは解決できないことを話します。
  • なので、エンジン利用者のプログラマのコミットは、
    エンジン開発者とは異なりビルドエラー時はコミットそのものが取り消されます。
    ですので、トランクは常にコンパイルが通る状態です。
    なお、エンジン利用者がコミットしてから、コミットの可否の結果が返ってくるまでは大体平均20秒程度です。
  • このページは、Public Domain以外のライセンスの元に公開されているコンテンツについて、然るべき権利表記を行うためのものです。
  • ゲームエンジン開発を支える技術

    1. 1. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ゲームエンジン開発を 支える技術 CIの使い方とWebサービスの提供 株式会社カプコン 是松 匡亮 / 齊藤 俊介
    2. 2. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. はじめに •題材 • カプコンで開発を進めている 新しいゲームエンジンの開発環境 •新しいゲームエンジンの資料 • 『いまどきのゲーム制作環境』- 市山裕介/是松匡亮 • https://cedil.cesa.or.jp/cedil_sessions/view/1303
    3. 3. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CIの運用とWEBサービス 第一部
    4. 4. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 第一部 / アジェンダ •導入 •CIの運用紹介 •見てもらえるCIへ •Webサービスの提供
    5. 5. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CI(継続的インテグレーション)の 必要性 導入
    6. 6. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 困っていたこと •出社して仕事を始めようとしたらビルドエラー •ビルドは通るが起動しない •起動するがバグでゲームが始まらない これらが当たり前のように発生
    7. 7. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CI黎明期 •深夜に自動ビルドをするbatを作成 • エラーの検出は1日1回 • 実行テストは行わない • PCは1台のみ •実施前よりもビルドが通りやすくなった
    8. 8. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CI黎明期 • 要求 • 日中も頻繁にビルドを行う • 全プラットフォームの全ビルド構成 • 実行テストを行う • テストに合格したものは配布する • ビルド履歴を確認できる • 自作をするには要求が多すぎる
    9. 9. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CIツール •Jenkinsを採用 • https://jenkins-ci.org/ •採用理由 • プラグインによる機能拡張が容易 • 日本語の情報が入手しやすい • SlideShare, Qiita, ブログ, ... • 当時やりたかったことが簡単にできた
    10. 10. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. コミットから配布まで CIの運用紹介
    11. 11. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. コミット / 全体像 Repository CIDevelopers
    12. 12. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. コミット / リポジトリへの送信 Repository CIDevelopers
    13. 13. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. コミット / CIの起床 Repository CIDevelopers
    14. 14. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. コミット / 構成 •svnを採用 • post-commitスクリプトを利用することが可能 • gitの場合はpost-updateが適切 •post-commitスクリプトでJenkinsを起床 • 現場で採用しているスクリプトは附録ページにあります wget http://jenkins/job/BuildEngine/buildWithParameters?BRANCH_NAME=trunk
    15. 15. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 全体像 Repository CI Developers Server
    16. 16. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / ビルドの実行 Repository CI Developers Server
    17. 17. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / ビルドの実行 • リポジトリから指定されたブランチをビルド • 開発者と同じ.slnをビルド • 複数台のスレーブPCが並行してビルドを行う • 複数のプラットフォーム • x64, PlatformA, PlatformB, ... • プラットフォームごとにすべての構成 • Debug, DebugOpt, Profile, QA, Ship • タイトルの要請に応じたカスタム構成 • レンダリングモジュールの差し替え, 社外貸出, etc.
    18. 18. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い Repository CI Developers Server
    19. 19. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い / 成功時 Repository CI Developers Server
    20. 20. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い / 成功時 •ビルドしたバイナリをNAS上に配置 •バイナリのMD5とリビジョンをサーバーに登録 • バイナリのMD5 と リビジョンの相互参照が可能 • ‘dev’属性としてマーク •テストに移行
    21. 21. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い / 成功時 / 実装 •バイナリのコピーはrobocopy •バイナリのファイルパスや属性は phpで受け口を作り、情報をMongoDBに格納 •phpへの送信はC#のコマンドラインツールを実装 • System.Web.WebClientクラスで10行程度
    22. 22. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い / 失敗時 Repository CI Developers Server
    23. 23. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い / 失敗時 •開発者にエラーを通知 • メールによる通知は廃止 • リアルタイム性を重視 • チャットに流す • Skype for Business, IRC, Slack, ...
    24. 24. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ビルド / 結果の取り扱い / 失敗時 / 実装 •エラー監視プロセスをJenkinsのジョブに登録 • 業務時間の開始から終了までの間、毎日実行 • 情報取得はJenkins Remote access APIを利用 • チャットツールへの通知は Lync APIを利用 CI DevelopersWatch dog
    25. 25. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / 全体像 CI ServerServer Developers
    26. 26. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / テストの実行 CI ServerServer Developers
    27. 27. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / テストの実行 •事前に定義されている動作テストを実行 • 起動, ゲームの実行, メモリリークテスト • スクリプトビルドの互換性テスト • API変更はObsolete属性による移行期間設置をルール化 •内製テストスイート • エンジンの挙動を非侵入的にテスト • テスト結果はJUnit形式で出力
    28. 28. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / 結果の取り扱い CI ServerServer Developers
    29. 29. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / 結果の取り扱い / 成功時 CI ServerServer Developers
    30. 30. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / 結果の取り扱い / 成功時 •サーバー上の属性を格上げ • ‘dev’から’stable’へ •シンボルサーバーに登録 • .dmpのデバッグ時にローカルシンボルが不要になる • “symstore”で検索 •配信開始
    31. 31. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / 結果の取り扱い / 失敗時 CI ServerServer Developers
    32. 32. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. テスト / 結果の取り扱い / 失敗時 •開発者にエラーを通知 • ビルド失敗時と同様
    33. 33. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 配布 / 全体像 Server Users
    34. 34. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 配布 •‘ブランチ名+構成+属性’で管理 • ‘trunk__81f16f39_00000000_stable’ •ユーザーはクライアントツールを通じて取得 • 取得する構成はタイトルごとに定義される •参考 • アップデートは1日あたり15回 • trunkへのコミットは20回
    35. 35. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. まとめ Repository CI Server UsersDevelopers
    36. 36. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 遭遇した問題と解決した方法 見てもらえるCIへ
    37. 37. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CI導入の先にあったもの •現場の歓迎する声 • 手動のデプロイが不要に • 従来は動作テストとリリースが手動 • エンジンのビルドはエンジンチーム任せ • 従来はタイトル開発者が自席でエンジンをビルド •新たな問題 • チャットに情報を流しても対処されるまでが長い
    38. 38. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 観察していてわかったこと •「どこを見たらよいのかわからない」 • 普段のビルドツールとは見た目が違うので戸惑う • “Jenkins”というだけで身構えてしまう人もいる •Jenkinsのページは開いてくれている • 対処が遅いのではなく、失敗理由がわかりづらい •スレーブPCやビルドツールの問題も発生する • 「Jenkinsよくわからない」に拍車を掛けてしまった
    39. 39. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 出来上がったもの • Jenkins上の情報を まとめたページ • 構成ごとに 配布中バージョン ビルド中バージョン コミットログ を表示
    40. 40. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 出来上がったもの • Jenkins上の情報を まとめたページ • 構成ごとに 配布中バージョン ビルド中バージョン コミットログ を表示
    41. 41. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 出来上がったもの / ビルドエラー時 • エラーと警告を表示 • 異常だと一目でわかる • ログをパースして 関連する行のみを表示 • 誰にでも理解できる • Visual Studioと同じ
    42. 42. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 出来上がったもの / テストエラー時 • ビルドエラーと 見た目を統一 • よくあるテスト失敗の 場合は解決策も提示
    43. 43. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 出来上がったもの / CIエラー時 • CI側の問題は別枠扱い • 迷わずCI担当者を 呼んでもらえるように • CI担当者いなくても ビルドフローを リセット可能 • 時間のロスと引き換え
    44. 44. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 出来上がったもの / 実装 •Jenkins の Remote access API を活用 • ほとんどの情報をJSON形式で取得可能 • php で json_decode() するだけ •CIエラーか否かの判定はログのパースで行う •svnコミットログは php 内で参照 • Svn::log()
    45. 45. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 得られた効果 •狙い通り • すぐにエラーを直してもらえるようになった •CI担当者としてのメリット • Jenkinsを明確に意識させる必要がなくなった • Jenkins側を複雑なジョブ構成をしても困らない • Jenkins上の様々なデータを集約可能 • ビルドフロー上は関連のないジョブの状態をまとめて表示
    46. 46. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. まとめ •Jenkinsの標準UIは万人受けしない • 慣れてもらうまでの時間が長い • シンプルなUIは受け入れられやすい •エラーを放置したい人はいない • できるだけ早くエラー内容を確認できる手段が重要
    47. 47. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 欲しい情報へのアクセスを手軽に Webサービスの提供
    48. 48. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. Webサービスのススメ •Webサービス化は業務効率を高める • 人の問題 • Webブラウザを立ち上げることに抵抗がない人が多い • デジタルネイティブ世代 • デバイスの問題 • WebはデバイスやOSを選ばない • スマートフォン、タブレット端末、PC •ビルド状態の確認以外にも様々なページを運用
    49. 49. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 更新情報 / 動機 •通知メールを後から探すのが大変 • 関係のないメールまで結果に含まれてしまう • 探す人の検索能力に依存する •検索機能をエンジンチームから提供 • 不要な情報が入り込む余地が無い
    50. 50. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 更新情報 / Webページ
    51. 51. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 更新情報 / Webページ
    52. 52. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 更新情報 / 実装 •フォームからPOSTされた内容を メール送信した直後にMongoDBへ登録 •表示と検索には DataTables を採用 • サーバーはMongoDBの格納データを全部返す • Webブラウザ内でフィルタリング • 5,000+件の更新内容でもストレスなく検索可能
    53. 53. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 更新情報 / 効果 •概ね好評 • タイトル開発者に多く利用されている •チャットツールで引用されるようになった • 以前:「○○さんがメールを送信されていたような」 • 現在:「http://.../ で報告されていますよ」
    54. 54. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 更新情報 / 今後の課題 •SVNとの連携が薄い • 「このリビジョンについては告知がされていない」 という問題の検出ができない
    55. 55. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / 動機 •クラッシュ時のメール通知を行っていた • 数十件のメールが毎日のように届く • 同じ箇所でクラッシュしたメールも大量に届く • 過去のクラッシュ情報の検索と追跡が困難 • 修正状況を確認することができない •レポート送信者にフィードバックがない • 「報告したあの件はどうなったのか」
    56. 56. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / Webページ
    57. 57. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / Webページ
    58. 58. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / Webページ
    59. 59. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / Webページ
    60. 60. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / 実装 • メールの代わりにサーバーへ情報をPOST • サーバーはMongoDBに書き込み • 同一案件があればマージ • スタックトレースを比較 • WebページはMongoDBの内容を表示 • 基本は更新情報のページと同じ • 修正状況の更新があれば報告者にメール通知 • 「調査を開始しました」、「修正されました」
    61. 61. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / 効果 •同一案件のマージは非常に強力 • 開発者も修正する気になる • 再発案件の検出も可能に •進捗の通知メールは利用者を安心させる • メール通知の時は送りっぱなしだった • クラッシュレポートを送信するモチベーションに
    62. 62. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュレポート / 今後の課題 •案件マージの限界 • 似ている案件をマージすることができない • スレッドごとスタックトレースは異なる • 異なるプラットフォームのマージが困難
    63. 63. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. その他 / 動機 •世の中のサービスは便利なものが多い • SlideShare, wandbox, Shadertoy, ... • 社内からアップロードはできない •社内にも欲しい • 開発中エンジンの機能紹介もスライドでやりたい • 異なるコンパイラで挙動を確認したい • シェーダーも書きたい
    64. 64. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. その他 / Webページ
    65. 65. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. その他 / Webページ
    66. 66. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. その他 / Webページ
    67. 67. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. その他 / 効果 •思っていたよりも多くの利用者 • UIに不自由があっても使ってもらえる • アウトプットの場を求めている人が多かった •情報のアウトプットに抵抗感のない人が多い • スマートデバイスとSNSが浸透したことのメリット? • 純粋に研究を行いたい人にも好評
    68. 68. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 第一部のまとめ •CIを導入することで手動作業を廃止 • 安定した環境を利用者に提供 •見てもらえるCIは専用のWebページから • Jenkinsの情報を開発者フレンドリーな形へ •社内Webサービスでやりたいことを形にする • 開発者のアウトプットしたい気持ちを無駄にしない
    69. 69. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジン採用タイトルを サポートするCI 第二部
    70. 70. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. アジェンダ 1.複数構成のデプロイ 2.エンジンに依存するツールの自動更新 3.CIマシンでのダンプ解析 4.自動プロファイル 5.エンジン開発者と利用者のビルドエラーフロー
    71. 71. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 複数構成のデプロイ CIの運用紹介
    72. 72. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 基本のCIビルドパイプラインのおさらい エンジン開発者 CI Build Test エンジン利用者 トランクにコミット エンジン配布
    73. 73. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 複数構成の必要性 CI Build Test エンジン利用者A 全部の機能が入った マスターのエンジンが 欲しい エンジン利用者B XXXミドルウェアは いらないから 除外して欲しい エンジン利用者C セキュリティの都合で ネットワーク系の機能を 全て除外して欲しい
    74. 74. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ブランチでの提供 エンジン利用者A 全部の機能が入った マスターのエンジンが 欲しい エンジン利用者B XXXミドルウェアは いらないから 除外して欲しい エンジン利用者C セキュリティの都合で ネットワーク系の機能を 全て除外して欲しい CI Build Test エンジン開発者 トランク コミット 各ブランチ コミット
    75. 75. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CIでの提供 エンジン利用者A 全部の機能が入った マスターのエンジンが 欲しい エンジン利用者B XXXミドルウェアは いらないから 除外して欲しい エンジン利用者C セキュリティの都合で ネットワーク系の機能を 全て除外して欲しい CI Build Testエンジン開発者 各構成用の変更を加え、 各構成の数だけ エンジンを生成 トランク コミット
    76. 76. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 複数構成デプロイの主な処理 1. 必要な構成設定を作成 2. コミット時に構成の数だけCIのジョブを発行 3. 各CIジョブの最初でワークスペースのデータに対 して構成設定の適応 4. 各CIジョブは各構成のエンジンをデプロイ
    77. 77. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 構成の切り分け方針 •基本はマクロでの各機能のON・OFF • .h .csproj .batなどのファイルを自動生成 •ソリューションから不要な設定の削除 • .sln .csprojから該当のビルド設定・参照設定を排除
    78. 78. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 構成設定の作成ツール
    79. 79. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CIジョブの発行 CI Build Test Start Job エンジン開発者 トランク コミット 構成の数だけ 下流ジョブを生成 Build Job A Build Job B Build Job C
    80. 80. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. デプロイまでのフロー CI Build Test Build Job A 取得した構成を元に ソースコードの自動生成 設定ファイルから不要な構成の削除 Test Job A エンジン利用者 各ユーザーが望む構成で エンジンを配布
    81. 81. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジンに依存する ツールの自動更新 CIの運用紹介
    82. 82. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジンに依存するツール エンジン ツール エンジンコードを 参照している 依存関係にある
    83. 83. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. ツールの自動更新 エンジン開発者 CI トランクにコミット ツール 依存しているコードが 更新されたら 自動的にツールをビルドして コミット
    84. 84. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CIマシンでのダンプ解析 CIの運用紹介
    85. 85. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. クラッシュ時のフロー エンジン クラッシュ エンジン開発者スタックトレースなどから クラッシュの概要を作成し サーバーに送信 上記の処理に必要なDLL等が存 在しない環境でエンジンが使用 されることがある
    86. 86. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. CIでのダンプ解析 エンジン クラッシュ エンジン開発者 CI CI上でダンプファイルを解析して 結果をJson形式で返す サーバーにダンプファイルを アップロード
    87. 87. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 自動プロファイル CIの運用紹介
    88. 88. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 多様なエンジン構成 プラットフォームA プラットフォームB プラットフォームC Debug Release マスターエンジン XXXミドルウェアなし エンジン シーン A シーン B シーン C ネットワークなし エンジン Master
    89. 89. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 早期発見したい問題 特定の構成・特定のシーンの 処理速度がいつの間にか低下している ・CIによる自動的なプロファイル
    90. 90. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 自動プロファイルのフロー CI エンジン 内製プロファイラでの プロファイル プロファイルの結果を ファイルサーバーと MongoDBに保存
    91. 91. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd.
    92. 92. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジン開発者と利用者の ビルドエラーフロー CIの運用紹介
    93. 93. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジン開発者のビルドエラーフロー エンジン開発者 CI トランクにコミット 失敗を通知 トランクはエラー状態 修正されるまで ビルドは通らず エンジンも配布されない ビルド エラー
    94. 94. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジン開発者と利用者のデータ更新関係 エンジン開発者 エンジン利用者 エンジンプログラマ タイトルプログラマ 正常なCIビルドフローを おこなったリビジョンのみ配布 エラーが出たら解決されるまで 全てのデータ更新が止まる CI アーティスト ビルドが通らない環境を 配布されても困る ここのデータ更新は いつでも素早く行いたい CIで更新を止めるのは イテレーション速度の低下 につながる
    95. 95. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. エンジン利用者のビルドエラーフロー エンジン利用者 CI トランクにコミット 失敗を通知 コミットそのものが 取り消される トランクは常に コンパイルが通る状態 テスト等の厳密な 動作チェックはせず イテレーション速度を重視 ビルド エラー
    96. 96. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 第二部のまとめ ・複数構成のデプロイ マクロ定義での切り分けで自動化対応 ・利用者の更新をロックしないビルドエラーフロー
    97. 97. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. LICENSE • Microsoft Cloud and Enterprise Symbol Set Version 2.3 • https://www.microsoft.com/en-us/download/details.aspx?id=41937 • https://azure.microsoft.com/en-us/documentation/articles/architecture-overview/ • Jenkins Logo Artworks • Jenkins project (http://jenkins-ci.org/)
    98. 98. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. 附録 本編で解説しきれなかったこと
    99. 99. Presented at Game Creators Conference 2016 CAPCOM Co., Ltd. post-commit スクリプト(CentOS 6.3で運用) REPOS="$1" REV="$2" # ----------------------------------------- # BRANCH NAME EXTRACTION. # ----------------------------------------- LOOKDIRS=`svnlook dirs-changed -r $REV $REPOS` LOOKFILES=`svnlook changed -r $REV $REPOS` MESSAGE=$(svnlook log $REPOS -r $REV) IFS=/ ary=($LOOKDIRS) if [[ $LOOKDIRS == trunk* ]] then branchName=${ary[0]} elif [[ ( $LOOKDIRS == branches/releases* ) ]] then ary2=($LOOKDIRSFILES) branchName=branches%2freleases%2f${ary2[2]} Fi # ------------------------------------------ # CANCEL BUILD TRIGGER IF MESSAGE SAYS SO. # ------------------------------------------ if [[ ( $MESSAGE == *[ignore]* ) ]] then branchName="" elif [[ ( $MESSAGE == *[docs]* ) ]] then branchName="" fi # ------------------------------------------ # INVOKE JENKINS. # ------------------------------------------ if [[ -n "$branchName" ]] # NOP then wget -O /dev/null http://jenkins.yours.com/job/BuildEngine/build?token=startBuild&BRANCH_NAME=$branchName Fi

    ×