白猫キャラクタのメモリ問題と解決策
View Slide
2自己紹介2017年 新卒でコロプラに入社2017年〜 : 「クイズRPG 魔法使いと黒猫のウィズ」2018年〜 : 「白猫プロジェクト」主に運用で必要な新規機能開発や、開発効率化のツール作成などを行っている髙山 大輝【 クライアントエンジニア 】Takayama Daiki
3おしながき1234メモリ計測の自動化スキルメモリ問題の見える化修正イテレーションの高速化アセット送信の応用甘口
4白猫について
5白猫についてド派手なスキル演出!
6白猫についてキャラクタごとに使用できるメモリ量のレギュレーションが決まっている
7キャラクタごとにメモリ計測12モデルキャラクタごとのメッシュやテクスチャなどアクションスキルごとのエフェクトやモーションなど
8キャラクタごとにメモリ計測12モデルキャラクタごとのメッシュやテクスチャなどアクションスキルごとのエフェクトやモーションなど手動計測
9キャラクタごとにメモリ計測3つの問題が発生
10手動計測での問題点計測時間人力のため作業開始までの待ち時間が発生計測結果のブレ人間が操作するため、結果にブレが出ることが多い? 問題箇所が不明合計メモリしか出ないため、修正方針が立てられない
11手動計測での問題点計測時間人力のため作業開始までの待ち時間が発生計測結果のブレ人間が操作するため、結果にブレが出ることが多い? 問題箇所が不明合計メモリしか出ないため、修正方針が立てられない自動化で解決できないか
12計測の自動化まかしとけJenkinsとPythonを使って自動で計測を行うようにする
13計測の自動化計測したいキャラクタをスプレッドーシートに記載
14計測の自動化シートからJenkinsにAPIでリクエストを送信API
15計測の自動化サーバーからアプリをダウンロード
16計測の自動化adbを使って端末にインストール
17計測の自動化自動実行に必要な情報が書いたファイルを端末に保存ファイルは Application.persistentDataPath に保存
18計測の自動化アプリ側で起動時に特定ファイルがあれば自動で記載された動作をするようにしておく
19計測の自動化adbを使ってアプリを起動
20計測の自動化設定ファイルに記載されたクエストにアクセスして、キャラが順番にスキルを発動していく
21計測の自動化結果をサーバーにアップロードするサーバー
22計測の自動化管理ツール上で結果が確認できる
23計測の自動化自動で実行している様子も確認できるように録画
24手動計測での問題点待ち時間なしですぐ計測できるように確認者の人件費も削減計測時間も短くなった計測結果が安定するようにブレが減ったので問題点が見つけやすくなった? 問題箇所が不明合計メモリしか出ないため、修正方針が立てられない自動化で解決
25手動計測での問題点待ち時間なしですぐ計測できるように確認者の人件費も削減計測結果が安定するようにブレが減ったので問題点が見つけやすくなった? 問題箇所が不明合計メモリしか出ないため、修正方針が立てられない計測結果から修正すべき箇所を判断するには?
26問題箇所が不明手動で計測していた頃の結果基準値からどれぐらいオーバーしているか
27問題箇所が不明どこを修正すればいいか全然わからない!
28よくあるメモリ問題3大パターン個別にメモリ増加の問題を確認して見つけたよくあるパターン3つ!
29よくあるメモリ問題3大パターン12メッシュに不要な頂点情報が混じっている3テクスチャのサイズや設定が不適切エフェクトのインスタンスが多い
30よくあるメモリ問題3大パターン12メッシュに不要な頂点情報が混じっている3テクスチャのサイズや設定が不適切エフェクトのインスタンスが多いデータに変な設定がされていないかを確認してもらう
31参照確認ツールアセットの参照を取得するメソッドEditorUtility.CollectDependencieshttps://docs.unity3d.com/jp/current/ScriptReference/EditorUtility.CollectDependencies.html
32参照確認ツール参照しているアセットの詳細を表示するツール
33参照確認ツールアセットの設定に問題が無いか簡単に確認できる
34よくあるメモリ問題3大パターン12メッシュに不要な頂点情報が混じっている3テクスチャのサイズや設定が不適切エフェクトのインスタンスが多いなぜエフェクトのインスタンス数が多いのか?
35エフェクトの作りスキルエフェクト1回目 スキル発動中 2回目 スキル発動中スキルエフェクトエフェクトの尺が長いと2つ存在するタイミングが発生
36エフェクトの作りスキルエフェクト1回目 スキル発動中 2回目 スキル発動中スキルエフェクトオブジェクトプールで管理されているためDestroyされずエフェクトのインスタンスが残り続けてしまう
37エフェクトの作りスキルエフェクト(900KB)1回目 スキル発動中 2回目 スキル発動中スキルエフェクト(900KB)合計メモリ : 1800 KB
38エフェクトの作りスキルエフェクト(900KB)1回目 スキル発動中 2回目 スキル発動中スキルエフェクト(900KB)合計メモリ : 1800 KB被ったインスタンス分メモリが増えていく!
39キャラクタごとにメモリ計測エフェクトが被らないようにすればいい(シンプル)
40エフェクトの作り1回目 スキル発動中 2回目 スキル発動中発動時エフェクト(300KB)メインエフェクト(300KB)余韻エフェクト(300KB)発動時エフェクト(300KB)メインエフェクト(300KB)余韻エフェクト(300KB)エフェクトを細かく分割!エフェクトのインスタンスが被らないようになった
41エフェクトの作り1回目 スキル発動中 2回目 スキル発動中発動時エフェクト(300KB)メインエフェクト(300KB)余韻エフェクト(300KB)発動時エフェクト(300KB)メインエフェクト(300KB)余韻エフェクト(300KB)合計メモリ : 900 KB
42デザイナに伝えるべき修正箇所12エフェクトごとの消費メモリ量エフェクトごとのインスタンス数
43デザイナに伝えるべき修正箇所メモリ計測結果にエフェクトごとの情報を追加
44手動計測での問題点待ち時間なしですぐ計測できるように確認者の人件費も削減計測結果が安定するようにブレが減ったので問題点が見つけやすくなった? 問題箇所が鮮明に問題箇所を絞れるので効率的に修正できる効率的な修正が可能に
45白猫についてキャラクタのメモリ計測の問題点は無事解決したのであった!
修正イテレーションの高速化
47修正が完了したが...修正が完了したので、今度はデータを反映させて実機で確認
48修正が完了したが...ここでまた待ち時間が発生してまう!
49確認までの待ち時間1月 2月 3月 4月3中イベント3末イベント4中イベント複数のイベントが並行して開発
50確認までの待ち時間アセットバンドルがコンフリクトしないように整合性を保つために1レーン運用1ラインバンドル化バンドル化バンドル化 バンドルキューバンドルキューバンドルキュー
51確認までの待ち時間アセットバンドルがコンフリクトしないように整合性を保つために1レーン運用1ラインバンドル化バンドル化バンドル化 バンドルキューバンドルキューバンドルキューアセットバンドル焼き待ちの行列ができている!
52直接実機に送信自分のPCからアセットバンドルを作って直接端末に送信
53送信方法PlayerConnectionクラスEditorからのデータを受信https://docs.unity3d.com/ja/2020.3/ScriptReference/Networking.PlayerConnection.PlayerConnection.htmlEditorConnectionクラスEditor→端末にデータを送信https://docs.unity3d.com/ja/current/ScriptReference/Networking.PlayerConnection.EditorConnection.html
54送信方法PlayerConnectionクラス受信したバイナリデータを元にアセットバンドルをロードするEditorConnectionクラス送信したいアセットのバンドルを作成バンドルのバイナリデータを送信
55前提エフェクトPrefabごとにアセットバンドル化されているエフェクトPrefab_AエフェクトPrefab_BエフェクトAバンドルエフェクトBバンドル
56Code修正したエフェクトだけを送信してすぐに実機で確認できる
57Code修正したエフェクトだけを送信してすぐに実機で確認できる修正イテレーションの高速化
アセット送信の応用
59新規プラットフォーム新しいプラットフォームでも動くようにしてよ偉い人!!
60新規プラットフォーム追加の課題アセットサーバー9年分のアセット長年運用で積み重なった大量のアセットが必要
61新規プラットフォーム追加の課題9年分のアセットアセットサーバープラットフォームA プラットフォームBプラットフォームごとにバンドルを作らないといけない
62新規プラットフォーム追加の課題9年分のアセットアセットサーバープラットフォームA プラットフォームBプラットフォームごとにバンドルを作らないといけない全部焼き直すと時間がかかりすぎる(サーバーも用意しないといけないし...)
63自動アセット送信くん実機でアセットエラーが出たらEditorでバンドルを作って送ってもらえばよいのでは!?
64自動アセット送信くん接続新規プラットフォームAUnityEditor事前にConnectionクラスを使ってEditorと実機を繋ぐ
65自動アセット送信くん[404]xxxのアセットがないよ!新規プラットフォームAUnityEditorローカルにアセットがなければEditor側に404のイベントを飛ばす
66自動アセット送信くんアセットバンドルを作って送信する新規プラットフォームAUnityEditor404のアセットをEditor側でバンドル化して実機に送信する
67自動アセット送信くん新規プラットフォームB新規プラットフォームA新規プラットフォームの追加やモック開発などを高速化できるUnityEditor
68まとめ1234メモリ計測の自動化Jenkinsと設定ファイルを使った自動実行スキルメモリ問題の見える化メモリが膨れるポイント3つ修正イテレーションの高速化直接バンドルを送信して確認アセット送信の応用実機にアセットがなければEditorから送信
イベントページリンク