研究開発といえばプログラミング。プログラミングといえば、ソースコードです。R&Dのスタッフも増え、中・大規模プロジェクト開発も増えてきました。そのためにコード管理をどのようにすべきか?コンパイルまわりから結合テストまで裏の裏の話をさせていただきます。
"MANIAC" CODEソースコードからツール化までMarc Salvati© OLM Digital, Inc. 1
View Slide
R&Dとは© OLM Digital, Inc. 2将来管理技術ネットワーク・マシン・ソフト要望・ソースコードプログラミング・情報工学CG・数学・物理学プラグイン・ツール新たな映像表現・長期企画・研究
R&Dとは© OLM Digital, Inc. 3将来管理技術ネットワーク・マシン・ソフトプログラミング・情報工学CG・数学・物理学プラグイン・ツール新たな映像表現・長期企画・研究要望・ソースコード
2008年のOLMのR&D• リード一人• 研究プロジェクト– 研究者二人– アニメーション– アセット管理、パイプライン• SI二人• 開発一人© OLM Digital, Inc. 4
コンパイル開発ソースコードからツールまで© OLM Digital, Inc. 5ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグイン要望・アイデア自動化新しい表現
コンパイル開発ソースコードからツールまで© OLM Digital, Inc. 6ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグイン要望・アイデア自動化新しい表現シンプルです!VC++ コピー
コンパイル開発ソースコードからツールまで© OLM Digital, Inc. 7ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグイン要望・アイデア自動化新しい表現シンプルです!VC++ コピー
開発環境とコンパイル数が多い• プロジェクトが多い• プロジェクト⇒DCCバージョン⇒コンパイラー• 開発環境– コンパイラー依存– OS依存• WindowsとLinux• 昔は32/64ビット• 再コンパイルが発生– DCCの新バージョン– Arnoldは一年に3-4回– ツールの改善• 要望• バグ発見© OLM Digital, Inc. 8プロジェクトAMaya 2019MtoA 3.2.1プロジェクトBMaya 2020MtoA 4.0.0VC 2015VC 2017GCC 6.3.1GCC 6.3.1
インストールが多い• 再コンパイル⇒再インストール– 人数分– プロジェクト分– レンダーファーム分• 共存インストールが必須– 同時に複数のプロジェクト関わる作業者– 異なったツールバージョンで作業– 異なったDCCバージョンで作業© OLM Digital, Inc. 9プロジェクトAMaya 2019MtoA 3.2.1プロジェクトBMaya 2020MtoA 4.0.0
自動化と管理が必要© OLM Digital, Inc. 10自動コンパイル開発環境の自動構築ソースファイルスクリプトプラグインライブラリ/SDK自動インストールスクリプトプラグイン要望・アイデアの管理自動化新しい表現
概要• ミスを防ぐ・効率的な開発環境– 要望とアイデアの管理– ソースコードのバージョン管理– 自動コンパイル・開発環境の自動構築– 結合テスト– バージョン番号の決め方– 自動インストール• まとめ© OLM Digital, Inc. 11
要望とアイデアの管理© OLM Digital, Inc. 12コンパイル開発ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグインアイデア自動化新しい表現
要望とアイデアの管理• 忘れないようにTrelloで管理• チケット管理– Pending– Todo– Doing– Done– Released© OLM Digital, Inc. 13
要望とアイデアの管理• Pending– 開発者にアサインしたい• Todo– 開発者決定– まもなく開発開始• Doing– 開発中• Done– 開発が終わった– アーティストには渡していない• Released– フィードバック待ち• Archive– フィードバックが終わり– 必要なチケット発行してから© OLM Digital, Inc. 14リード開発者リード
ソースコードのバージョン管理© OLM Digital, Inc. 15コンパイル開発ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグインアイデア自動化新しい表現
ソースコードが多数• 12人– パイプライン(~3.5人)• 自動化・効率化• データ・アセット管理ツール• スクリプト系と単独アプリが多い– 開発(~8.5人)• 画像処理、シェーダーなどの一般CG開発• C++でのDCCのプラグイン開発が多い• 数百万ラインのコード© OLM Digital, Inc. 16
バージョン管理無しの運用© OLM Digital, Inc. 17プロジェクトBOLM ToonOLM ToonOLM Toon機能追加リリース無しプロジェクト開始更新のタイミングOLM Toonを使っているプロジェクトが全部終わっているプロジェクトAOLM ToonプロジェクトC新OLM Toon制作開発
バージョン管理ありの運用© OLM Digital, Inc. 18プロジェクトBOLM Toon 2.0OLM Toon2.0OLM Toon2.1(機能追加)プロジェクト開始更新のタイミング必要に応じてプロジェクトAOLM Toon 2.0プロジェクトBOLM Toon 2.1プロジェクトCOLM Toon 2.1制作開発
ソースコードの管理• ツールのバージョン管理のため• R&Dの資産– ソースコードはなくしてはならない– 取り消し・やり直しがしたい• 共有したい– 共同開発のため– コードレビューのため– ライブラリの共有⇒ソースコードのバージョン管理が必須!© OLM Digital, Inc. 19
共有するサーバーSVNで管理© OLM Digital, Inc. 20ツール1.0ツールtrunk 最新のソースコードリリースされたツール1.0のソースコード
共有するサーバーSVNの仕組み© OLM Digital, Inc. 21ツール1.0ツールtrunk開発者1ツールtrunkツール1.0開発の開始前にサーバーから最新のソースコードをダウンロードチェックアウト
共有するサーバーSVNの仕組み© OLM Digital, Inc. 22ツール1.0ツールtrunk開発者1ツールtrunkツール1.0最新のコードを修正
共有するサーバーSVNの仕組み© OLM Digital, Inc. 23ツール1.0ツールtrunk開発者1ツールtrunkツール1.0最新バージョンから新たなバージョンを作るツール2.0
共有するサーバーSVNの仕組み© OLM Digital, Inc. 24ツール1.0ツールtrunk開発者1ツールtrunkツール1.0新たに作ったツールバージョンを共有サーバーにアップロードツール2.0ツール2.0コミット
共有するサーバーSVNの仕組み© OLM Digital, Inc. 25ツール1.0ツール2.0ツールtrunk開発者1開発者2ツールtrunkツール1.0ツール1.0ツールtrunkツール2.0ツール2.0ツール3.0ツール3.0コミットチェックアウトもう一人の開発者が簡単に開発を進められる
SVNリポジトリーの構成© OLM Digital, Inc. 26共有個人AEMayaNukeolm_libSConstructOLM Smootherae_lib1.01.2trunksrcvcSConscript
AEMayaNukeolm_libSConstructSVNリポジトリーの構成© OLM Digital, Inc. 27共有個人OLM Smootherae_lib1.01.2trunksrcvcSConscriptOLMのライブラリ
AEMayaNukeolm_libSConstructSVNリポジトリーの構成© OLM Digital, Inc. 28共有個人OLM Smootherae_lib1.01.2trunksrcvcSConscript自動コンパイル周り(Scons)
共有ができるからコードレビュー• 他の開発者のコードを見る– バグ発見– ルールを守る– ディスカッションする– 勉強になる• OLMでは– 2-3週間ごとに2人が提出、7-8人が見る• レビューするところを自由に選ぶ– ミーティングでディスカッション© OLM Digital, Inc. 29
今後• アーティストのコード管理– ソース管理にあまり馴染みがない• Gitに移動– Gitがスタンダード– リモートの時代なので• Git対応のクラウドサービスが多い– 開発プロジェクトの規模が大きくなってきている– 開発者が増えている– 課題• SVNと違ってモノリシックなコードベースではない• 運用ルールが必要© OLM Digital, Inc. 30
自動コンパイルと開発環境の自動構築© OLM Digital, Inc. 31コンパイル開発ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグインアイデア自動化新しい表現
コンパイルが多い:例• MtoAを更新• サポートされているMayaのバージョン• WindowsとLinuxコンパイル– レンダーファームがLinux– アーティストのパソコンはWindows• シェーダー数© OLM Digital, Inc. 32X3-4202X120-160コンパイル数
Sconsで自動コンパイル• Pythonで書く– わかりやすい– メンテしやすい• ツールごとにコンパイルファイル一個– Sconscript• コマンドライン– ツール名・バージョン– DCC名・バージョン© OLM Digital, Inc. 33
SConscriptファイルがシンプルに!Import("env")import sconsUtil.source_library as source_libraryimport sconsUtil.library as librarysourceFiles= Glob("src/*.cpp")sharedFiles = source_library.SourceRequest.get(LIB_NAME, LIB_VERSION, env, SOURCE_FILES)libRequests=[library.LibraryRequest(LIB_NAME, LIB_VERSION, LIB_FILES)]output = env.compileElement.build(env, sourceFiles, sharedFiles, libRequests)Return('output')© OLM Digital, Inc. 34コンパイルされるソースコードのファイルOLMの共有ソースコードライブラリコンパイルされているライブラリ
MayaのOLM Noise DeformerのSconscriptImport("env")import sconsUtil.source_library as source_librarysourceFiles= Glob("src/*.cpp")sharedFiles = source_library.SourceRequest.get("olm_maya_util", "2.0.1", env, [ "MAYA_General.cpp"])output = env.compileElement.build(env, sourceFiles, sharedFiles, [])Return('output')© OLM Digital, Inc. 35コンパイルされるソースコードのファイルOLMの共有ソースコードライブラリMayaのSDK、バージョンなど書いていないMayaのバージョン変えても使える
Sconsのライブラリ• DCCのコンパイル手続き– バージョンに合わせて• コンパイラー• コンパイルオプション– 特殊ケースの対応(AEのPiplなど)• ライブラリの自動設定– OLMの共有コード• ソースコードの自動追加– DCCのSDKライブラリ– 外部ライブラリ© OLM Digital, Inc. 36
Sconsの実行• コマンドライン– LinuxとWindowsで可能– それぞれのログインが必要• 処理– SVNの更新– サーバーから前のプラグインを削除– 前のコンパイル結果削除– コンパイル– 自動インストールの準備• サーバーへのコピー• 一つのツールのコンパイル可能– 複数のツールバージョン– DCC複数© OLM Digital, Inc. 37
JenkinsでSconsラッピング• コンパイルを一括化– 複数のツールの一括コンパイル– WindowsとLinux両方コンパイル– ウェブUIから実行• コンパイル結果とログの共有• 結合テスト実行© OLM Digital, Inc. 38
コンパイルフローのまとめ© OLM Digital, Inc. 39Visual C++で設定Visual Studio CodeNotepad++PyCharmVisual C++でコンパイルVisual C++で修正・作成ソースファイルスクリプトプラグインライブラリ/SDKDCCで試すスクリプトプラグインサーバースクリプトプラグインSVNソースファイルサーバーライブラリ/SDKScons/Jenkins自動コンパイルプラグインスクリプトスクリプト開発者のコンパイル自動コンパイルSConscriptVisual C++ファイル
コンパイルフローのまとめ© OLM Digital, Inc. 40Visual C++で設定Visual Studio CodeNotepad++PyCharmVisual C++でコンパイルVisual C++で修正・作成ソースファイルスクリプトプラグインライブラリ/SDKDCCで試すスクリプトプラグインサーバースクリプトプラグインSVNソースファイルサーバーライブラリ/SDKScons/Jenkins自動コンパイルプラグインスクリプトスクリプト開発者のコンパイル自動コンパイルSConscriptVisual C++ファイル
自動コンパイルと開発環境の自動構築© OLM Digital, Inc. 41Visual C++で設定Visual Studio CodeNotepad++PyCharmVisual C++でコンパイルVisual C++で修正・作成ソースファイルスクリプトプラグインライブラリ/SDKSVNソースファイルサーバーライブラリ/SDKスクリプト開発者のコンパイルCMakeで自動構築Visual C++ファイルDCCで試すスクリプトプラグインサーバースクリプトプラグインJenkins自動コンパイルプラグインスクリプト自動コンパイル
なぜCMake?© OLM Digital, Inc. 42
CMake• 長い歴史– オプションとライブラリの場所指定– コンパイルができる開発環境生成• Makeファイル• VC++ファイル• 2017年からCppConでモダンCMakeが話題– チュートリアルとドキュメントが多い– 使用者が増えた© OLM Digital, Inc. 43
モダンCMake• CMake 3からモダン– 以前はHeaderとライブラリのInclude、フラグのリスト– 今はターゲットベース• ライブラリの再利用中心• フラグはユーザーに© OLM Digital, Inc. 44外部からライブラリを見つける ライブラリとリンク
モダンCMake• CMake 3からモダン– 以前はHeaderとライブラリのInclude、フラグのリスト– 今はターゲットベース• ライブラリの再利用に中心• フラグはユーザーに© OLM Digital, Inc. 45共有ソースコードをライブラリ化にDCCバージョンで決まるライブラリとリンク外部からライブラリを見つける
AEのコンパイル設定のライブラリ化© OLM Digital, Inc. 46
AEプラグインのコンパイル手続き© OLM Digital, Inc. 47
まとめ• 自動コンパイル– DCCのバージョンアップがしやすい– ツールの配布がしやすい• 自動インストールを楽にする• Cmakeへの移行– 開発環境の自動構築• 開発者と自動コンパイル環境の統一• コンパイル設定の一貫性の改善– Sconsよりもちょっとファイルが長い– まだ勉強中© OLM Digital, Inc. 48
結合テスト© OLM Digital, Inc. 49コンパイル開発ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグインアイデア自動化新しい表現
なぜ?• ツールが思う通りに動いているか?チェックが必要– DCCバージョン毎– LinuxとWindows– DCC毎のチェックが違う• Mayaの例:Maya+Arnoldの組み合わせ• AEの例:8/16/32ビット、解像度・マスク付きなど• 手動では無理!• 自動化が必要!© OLM Digital, Inc. 50
確認したいこと• 動作– ロードができるか– UIが動いているか– それぞれの機能が動いているか• レンダリング– 今までの出力結果と同じ– 時間• DCCのバージョンでの互換性© OLM Digital, Inc. 51
レンダリングベースのテスト• レンダリング結果の比較で分かる– ピクセルが一緒なら• プラグインのロードができて• レンダリングの互換性• 機能の動作が正常– レンダリング時間の比較も可能• シンプル– DCC毎に同じアプローチ可能– 自動化しやすい© OLM Digital, Inc. 52リファレンスシーンDCC V1テストシーンDCC V3テストシーンDCC V2レンダリング結果DCC V1レンダリング結果DCC V2レンダリング結果DCC V3レンダリング レンダリング レンダリングピクセルごとの比較と報告
AEの例:チェックする項目• AEのスクリプトで自動生成– コンポよりも大きいレイヤーに適用– レイヤーよりも小さいマスクの適用– ガウシアンブラー適用後のエフェクト適用– 四角でないピクセルの適用– 8/16/32ビット– フル解像度、半分の解像度• 連番レンダリング– 可逆圧縮LZW圧縮のTiff© OLM Digital, Inc. 53レンダリング数=AEバージョン数xツールバージョン数xコンポ数x3 X 2フル・半分解像度8・16・32ビット
AEの例:自動レンダリングと比較• Pythonスクリプト• レンダーファームに投げる– Deadline– AEライセンスのあるマシンに• 比較– 画像の比較– ピクセルの差があるファイル数を出力• 差が<1%、<10%、>10%• ImageMagick?遅すぎました• LibTiffのtiffcmp.cのカスタム版• Jenkinsで実行– リファレンスのレンダリング– テストのレンダリングと比較© OLM Digital, Inc. 54
今後• リファレンスの更新のやり方、自動化• AE– それぞれのAEプラグインのリファレンス作成• Maya– シェーダー、リグ、デフォーマーはレンダリングで– GPUレンダリングはPlayblast?– 自動化のスクリプト系は?• その他のDCCも– Nuke– Houdini– Photoshop・・・© OLM Digital, Inc. 55
バージョン番号の決め方© OLM Digital, Inc. 56コンパイル開発ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグインアイデア自動化新しい表現
概要• プロジェクトごとの運用– 開始時は最新– 必要に応じて途中でバージョンアップ• クラッシュ問題• 必要になった機能‐ アセット ↔ ツールバージョン の管理が必要になる!• 見てバージョンアップ可能か知りたい© OLM Digital, Inc. 57
セマンティックバージョニング© OLM Digital, Inc. 58X.X.Xマイナーメジャー パッチ
セマンティックバージョニング© OLM Digital, Inc. 59後方互換性がある機能を追加した場合APIの変更に互換性のない場合後方互換性を伴うバグ修正をした場合ライブラリのために作られたルールX.X.X
セマンティックバージョニング© OLM Digital, Inc. 60互換性がある機能性互換性がない 互換性を伴うバグX.X.X
映像制作でのバージョニング• バグと機能の違いは大事じゃない• 使えるかどうかが大事– エラーなくシーンを開ける?– 思ったような画像になる?• バージョンを見て更新するかどうか判断したい© OLM Digital, Inc. 61
映像制作でのバージョニング© OLM Digital, Inc. 62出力結果が変わった前のシーンを開けないまだプロダクションでは使えないのは0その他出力結果も構造も変わらない• 機能追加• バグ修正出力構造 互換性X.X.X
映像制作でのバージョニング© OLM Digital, Inc. 63出力結果が変わったその他出力結果も構造も変わらない• 機能追加• バグ修正出力構造 互換性X.X.X (.X)パッチ前のシーンを開けないまだプロダクションでは使えないのは0
パッチってなに?Wikipediaから「パッチ(英: patch)とは、コンピュータにおいてプログラムの一部分を更新してバグ修正や機能変更を行うためのデータのこと。「修正プログラム」や「アップデート(プログラム)」などとも呼ばれる。」小さいバージョンアップOLMでは一時的にバージョンアップ© OLM Digital, Inc. 64
パッチってなに?© OLM Digital, Inc. 65プロジェクトBOLM Toon 2.0引き続き、パッチOLM Toon 2.0.0.1OLM Toon 2.0OLM Toon 2.1機能修正OLM Toon 3.0大幅機能追加OLM Toon 2.1.1クラッシュ修正バージョンアップOLM Toon 2.1.1OLM Toon 2.0.0.12.0+2.1.1クラッシュ修正プロジェクト開始2.0でクラッシュが起きるのを発見 プロジェクト終了プロジェクトDOLM Toon 2.0プロジェクトAOLM Toon 2.0プロジェクトCOLM Toon 2.0プロジェクトOLM Toon 3.0パッチ無しの運用パッチありの運用
まとめ• バージョン番号のルールが大事– 管理が必須• バージョンは分かりやすい– 見て使えるか分かる– 開発者が決めやすい• リリースノートもしっかり– どう互換性がなくなったのか– 画像がどう変わったか– どういう機能を追加したのか© OLM Digital, Inc. 66出力構造 互換性X.X.X (.X)パッチ
自動インストール© OLM Digital, Inc. 67コンパイル開発ソースファイルスクリプトプラグインライブラリ/SDKインストールスクリプトプラグインアイデア自動化新しい表現
なぜ自動インストール• ツールを使ってもらいたい– 使えるようにインストールしたい– DCC毎に設定が違う• いくつかのプロジェクトを平行で作業する– DCCの起動時ツールのバージョンを選びたい• 自動化が必要© OLM Digital, Inc. 68
OLM Setup• ツールリストからツールの設定– コピー– DCC内で使えるように• DCCを起動• バッチで実行• 最近OLM Setup Launcherでバッチ実行© OLM Digital, Inc. 69
OLM Setup Launcher© OLM Digital, Inc. 70DCC環境:プロダクション、テスト、開発プロジェクト名プロファイル名
• プロダクション環境– 制作する環境– 安定したもの– バージョン固定• テスト環境は制作に使わない約束環境とは?© OLM Digital, Inc. 71開発 プロダクションOLM Toon 1.0.1 OLM Toon 1.0.1開発中OLM Toon 1.1リリースバージョン固定OLM Toon 1.0テスト
プロファイルとは• XMLファイル• プロジェクトが使うツールのリスト– DCCのバージョン– ツールのバージョン– MtoA・Bifrostのバージョン• 外部のツールも扱う– OpenVDB– Golaem– Yeti• 同じプロファイル=再現可能© OLM Digital, Inc. 72
OLMSetupのフォルダー構成• コンパイル後、ファイルサーバーへ– 構成ルール• ツールのフォルダーの構成はDCCによる– DCC個別の設定が必要© OLM Digital, Inc. 73olmsetup productiontestdevtools aemayanukehoudinipstoonboomolmothersツール名 バージョン
ツール名バージョン例:Mayaフォルダー構成© OLM Digital, Inc. 74plugins 64Mayaバージョン windows ツール名.mlllinuxarnold_shader 64Arnoldバージョン windows ツール名.dlllinuxscriptsツール名.soツール名.soextensionsheaderpythonTemplatesMayaバージョン 64 windowslinuxツール名.dllツール名.soツール名.mtdノード名Template.pymelogsfxpythonxmlolm_uis_ツール名.mel AEノード名Template.mel *.mel*.ogsfx*.py*.xml
ツール名バージョン例:Mayaフォルダー構成© OLM Digital, Inc. 75binbifrost config.json*.exe *.dll *.pydiconsmodule*.pngMayaのモジュール構成。省略。mental_ray_shader もう使わない。省略。¥olmsetup devtestproductionプロフィル名 ツール名 ツールバージョンmaya pluginsarnold_shader…
Mayaの設定• 実行する前にコピー• 実行する前に環境変数を設定– MAYA_PLUG_IN_PATH:プラグインフォルダー– MAYA_MODULE_PATH:モジュール– MAYA_SCRIPT_PATH:MELスクリプトフォルダー– PYTHONPATH:Pythonスクリプト– XBMLANGPATH:アイコンフォルダー– MI_CUSTOM_SHADER_PATH:MentalRayシェーダー– BIFROST_LIB_CONFIG_FILES:BifrostのCompound– ARNOLD_PLUGIN_PATH:Arnoldのプロシジャー– MTOA_EXTENSIONS_PATH:ArnoldのTranslatorなど– MAYA_RENDER_DESC_PATH:レンダラー– MAYA_COLOR_MANAGEMENT_POLICY_FILE:カラーマネジメント用– MAYA_UI_LANGUAGE:英語・日本語の切替– ADSKFLEX_LICENSE_FILE:ライセンスサーバーの指定– コマンドライン用• LD_LIBRARY_PATH:コマンドラインツールの実行• PATH:コマンドラインツールの実行© OLM Digital, Inc. 76プラグイン用Arnold用
まとめ© OLM Digital, Inc. 77
ルールが大事• ルール無し=自動化無し• ルールとは– 決める(管理)– 守る(自動)– 使う(自動)• 柔軟な対応が可能なルール– さまざまなDCCの対応• OLMではPhotoshop, After Effects, Maya, Nuke, Houdini, Arnold, …– さまざまな環境(OS・リモート・・・)© OLM Digital, Inc. 78
開発の世界自動化と管理© OLM Digital, Inc. 79自動コンパイル自動結合テスト自動開発環境構築コードレビューバージョン管理ソースファイルスクリプトプラグインライブラリ/SDK自動インストールバージョン管理スクリプトプラグイン情報管理アイデア要望リクエスト
結論• 管理がないと将来の道がない– 人数が多いほど大事• 自動化・仕組みが必要– 技術の進化に伴い更新• 管理の幅が広い– コード– ツール– 要望– 人© OLM Digital, Inc. 80将来管理技術