【TECH BLOG #38】マスターデータのビルド時間短縮

グリーエンターテインメント株式会社 エンジニア部の白井です。
皆さん、ビルド時間は好きですか?
個人的にはそこそこ好きな方かもしれません。
流れるコンソールログ、急に動き出すプログレスバー、なぜか99%で止まる進捗表示、ついつい眺めてしまいます。
とはいえ、仕事としては早く済むに越したことはないので、今回はそれを短くするお話をしたいと思います。
前提条件など
現在携わっているプロダクトでは、クライアント側にUnityのアセットバンドルとしてマスターデータの一部を配信しています。
そのアセットバンドルは専用のPCを用意してビルドしているのですが、ビルド時間が長くかかり開発効率が落ちてしまっていました。
色々な手段を試していますが、今回はマスターデータ固有の処理(変換や暗号化など)に触れていないので、一般的なビルド時間短縮のヒントになれば幸いです。
対応した内容
シャロークローンとパーシャルクローン
ビルド対象のデータはGitサーバーから持ってきています。
ビルドする際には最新のファイルさえあればいいので、Gitのシャロークローンやツリーレスクローン(パーシャルクローン)の機能を試してみました。
ですが、ビルド後もソースを消さずに残しているので、ブランチを変える際に余計な時間かかってしまい採用しませんでした。
毎回クローンし直す場合には有効だと思います。

スパースチェックアウト
ビルド対象のUnityプロジェクトに不要なフォルダが含まれていました。
ビルドしている間、このフォルダを別の場所に退避しておくようシェルで書かれてたので、そもそもGitのチェックアウト対象から外してしまいました。
結果としてブランチ切り替えの際の時間は大きく短縮されました。

コマンドラインオプションの見直し
ビルドした成果物を移動する際のrsyncコマンドのオプションを調整しようと試みましたが、ここは十分に調整されていて特に変更する所はありませんでした。
ひとまずポイントとして、「–checksum」は重い(–ignore-timesの方がマシ)という点と、無視できる部分があるなら「–exclude」で指定する、あたりかと思います。
次に、Unityをバッチ実行する際のオプションですが、一般的に「-batchmode」と「-quit」をつけると思います。なぜか一部に「-nographics」が付いていなかったので付けておきました。
こちらの効果はそこまで体感できませんでした。(どちらかと言えば可搬性の為のオプションだと思います)
ビルド対象の限定
ようやく本丸というか、やはり結果としては一番これが効果ありました。
ビルドのスクリプトを調整して、マスターデータ以外のアセットや、内容が固定された過去のマスターをビルド対象から外すようにしました。
ビルドよりもインポートに時間がかかる場合もあるので、うまく仕分けできるならUnityを起動する前に消しておくのも有効です。
改善の結果
以上の対応の結果、ビルド時間が40分から15分まで短縮されました。

まとめ
全体的にGitやファイルの同期よりもUnityの処理の方が重いです。
Unityをバッチ実行する前の時点で「如何にビルド対象だけが存在する状態にするか」がキモになると思います。
ゲームのマスターデータは、運営を続けていくと日々増えていくものなので、そこにどう対応するかが次の課題ですね。
改善、頑張っていきましょう。
本件に関するお問い合わせ先
グリーエンターテインメント株式会社 広報担当
東京都港区六本木6-11-1 六本木ヒルズゲートタワー
E-mail:info-ent@ml.gree.net