Slide 1

Slide 1 text

白猫キャラクタのメモリ問題と解決策

Slide 2

Slide 2 text

2 自己紹介 2017年 新卒でコロプラに入社 2017年〜 : 「クイズRPG 魔法使いと黒猫のウィズ」 2018年〜 : 「白猫プロジェクト」 主に運用で必要な新規機能開発や、 開発効率化のツール作成などを行っている 髙山 大輝 【 クライアントエンジニア 】 Takayama   Daiki

Slide 3

Slide 3 text

3 おしながき 1 2 3 4 メモリ計測の自動化 スキルメモリ問題の見える化 修正イテレーションの高速化 アセット送信の応用 甘口

Slide 4

Slide 4 text

4 白猫について

Slide 5

Slide 5 text

5 白猫について ド派手なスキル演出!

Slide 6

Slide 6 text

6 白猫について キャラクタごとに使用できるメモリ量の レギュレーションが決まっている

Slide 7

Slide 7 text

7 キャラクタごとにメモリ計測 1 2 モデル キャラクタごとの メッシュやテクスチャなど アクション スキルごとの エフェクトやモーションなど

Slide 8

Slide 8 text

8 キャラクタごとにメモリ計測 1 2 モデル キャラクタごとの メッシュやテクスチャなど アクション スキルごとの エフェクトやモーションなど 手動計測

Slide 9

Slide 9 text

9 キャラクタごとにメモリ計測 3つの問題が発生

Slide 10

Slide 10 text

10 手動計測での問題点 計測時間 人力のため作業開始までの待ち時間が発生 計測結果のブレ 人間が操作するため、結果にブレが出ることが多い ? 問題箇所が不明 合計メモリしか出ないため、修正方針が立てられない

Slide 11

Slide 11 text

11 手動計測での問題点 計測時間 人力のため作業開始までの待ち時間が発生 計測結果のブレ 人間が操作するため、結果にブレが出ることが多い ? 問題箇所が不明 合計メモリしか出ないため、修正方針が立てられない 自動化で解決できないか

Slide 12

Slide 12 text

12 計測の自動化 まかしとけ JenkinsとPythonを使って 自動で計測を行うようにする

Slide 13

Slide 13 text

13 計測の自動化 計測したいキャラクタをスプレッドーシートに記載

Slide 14

Slide 14 text

14 計測の自動化 シートからJenkinsにAPIでリクエストを送信 API

Slide 15

Slide 15 text

15 計測の自動化 サーバーからアプリをダウンロード

Slide 16

Slide 16 text

16 計測の自動化 adbを使って端末にインストール

Slide 17

Slide 17 text

17 計測の自動化 自動実行に必要な情報が書いたファイルを端末に保存 ファイルは Application.persistentDataPath に保存

Slide 18

Slide 18 text

18 計測の自動化 アプリ側で起動時に特定ファイルがあれば 自動で記載された動作をするようにしておく

Slide 19

Slide 19 text

19 計測の自動化 adbを使ってアプリを起動

Slide 20

Slide 20 text

20 計測の自動化 設定ファイルに記載されたクエストにアクセスして、 キャラが順番にスキルを発動していく

Slide 21

Slide 21 text

21 計測の自動化 結果をサーバーにアップロードする サーバー

Slide 22

Slide 22 text

22 計測の自動化 管理ツール上で結果が確認できる

Slide 23

Slide 23 text

23 計測の自動化 自動で実行している様子も確認できるように 録画

Slide 24

Slide 24 text

24 手動計測での問題点 待ち時間なしですぐ計測できるように 確認者の人件費も削減 計測時間も短くなった 計測結果が安定するように ブレが減ったので問題点が見つけやすくなった ? 問題箇所が不明 合計メモリしか出ないため、修正方針が立てられない 自動化で解決

Slide 25

Slide 25 text

25 手動計測での問題点 待ち時間なしですぐ計測できるように 確認者の人件費も削減 計測結果が安定するように ブレが減ったので問題点が見つけやすくなった ? 問題箇所が不明 合計メモリしか出ないため、修正方針が立てられない 計測結果から 修正すべき箇所を判断するには?

Slide 26

Slide 26 text

26 問題箇所が不明 手動で計測していた頃の結果 基準値からどれぐらい オーバーしているか

Slide 27

Slide 27 text

27 問題箇所が不明 どこを修正すればいいか 全然わからない!

Slide 28

Slide 28 text

28 よくあるメモリ問題3大パターン 個別にメモリ増加の問題を確認して見つけた よくあるパターン3つ!

Slide 29

Slide 29 text

29 よくあるメモリ問題3大パターン 1 2 メッシュに不要な頂点情報が混じっている 3 テクスチャのサイズや設定が不適切 エフェクトのインスタンスが多い

Slide 30

Slide 30 text

30 よくあるメモリ問題3大パターン 1 2 メッシュに不要な頂点情報が混じっている 3 テクスチャのサイズや設定が不適切 エフェクトのインスタンスが多い データに変な設定がされていないかを 確認してもらう

Slide 31

Slide 31 text

31 参照確認ツール アセットの参照を取得するメソッド EditorUtility.CollectDependencies https://docs.unity3d.com/jp/current/ScriptReference/EditorUtility.CollectDependencies.html

Slide 32

Slide 32 text

32 参照確認ツール 参照しているアセットの詳細を表示するツール

Slide 33

Slide 33 text

33 参照確認ツール アセットの設定に問題が無いか簡単に確認できる

Slide 34

Slide 34 text

34 よくあるメモリ問題3大パターン 1 2 メッシュに不要な頂点情報が混じっている 3 テクスチャのサイズや設定が不適切 エフェクトのインスタンスが多い なぜエフェクトのインスタンス数が多いのか?

Slide 35

Slide 35 text

35 エフェクトの作り スキルエフェクト 1回目 スキル発動中 2回目 スキル発動中 スキルエフェクト エフェクトの尺が長いと 2つ存在するタイミングが発生

Slide 36

Slide 36 text

36 エフェクトの作り スキルエフェクト 1回目 スキル発動中 2回目 スキル発動中 スキルエフェクト オブジェクトプールで管理されているためDestroyされず エフェクトのインスタンスが残り続けてしまう

Slide 37

Slide 37 text

37 エフェクトの作り スキルエフェクト(900KB) 1回目 スキル発動中 2回目 スキル発動中 スキルエフェクト(900KB) 合計メモリ : 1800 KB

Slide 38

Slide 38 text

38 エフェクトの作り スキルエフェクト(900KB) 1回目 スキル発動中 2回目 スキル発動中 スキルエフェクト(900KB) 合計メモリ : 1800 KB 被ったインスタンス分 メモリが増えていく!

Slide 39

Slide 39 text

39 キャラクタごとにメモリ計測 エフェクトが被らないようにすればいい (シンプル)

Slide 40

Slide 40 text

40 エフェクトの作り 1回目 スキル発動中 2回目 スキル発動中 発動時エフェクト (300KB) メインエフェクト (300KB) 余韻エフェクト (300KB) 発動時エフェクト (300KB) メインエフェクト (300KB) 余韻エフェクト (300KB) エフェクトを細かく分割! エフェクトのインスタンスが被らないようになった

Slide 41

Slide 41 text

41 エフェクトの作り 1回目 スキル発動中 2回目 スキル発動中 発動時エフェクト (300KB) メインエフェクト (300KB) 余韻エフェクト (300KB) 発動時エフェクト (300KB) メインエフェクト (300KB) 余韻エフェクト (300KB) 合計メモリ : 900 KB

Slide 42

Slide 42 text

42 デザイナに伝えるべき修正箇所 1 2 エフェクトごとの消費メモリ量 エフェクトごとのインスタンス数

Slide 43

Slide 43 text

43 デザイナに伝えるべき修正箇所 メモリ計測結果にエフェクトごとの情報を追加

Slide 44

Slide 44 text

44 手動計測での問題点 待ち時間なしですぐ計測できるように 確認者の人件費も削減 計測結果が安定するように ブレが減ったので問題点が見つけやすくなった ? 問題箇所が鮮明に 問題箇所を絞れるので効率的に修正できる 効率的な修正が可能に

Slide 45

Slide 45 text

45 白猫について キャラクタのメモリ計測の問題点は 無事解決したのであった!

Slide 46

Slide 46 text

修正イテレーションの 高速化

Slide 47

Slide 47 text

47 修正が完了したが... 修正が完了したので、 今度はデータを反映させて実機で確認

Slide 48

Slide 48 text

48 修正が完了したが... ここでまた待ち時間が発生してまう!

Slide 49

Slide 49 text

49 確認までの待ち時間 1月 2月 3月 4月 3中イベント 3末イベント 4中イベント 複数のイベントが並行して開発

Slide 50

Slide 50 text

50 確認までの待ち時間 アセットバンドルがコンフリクトしないように 整合性を保つために1レーン運用 1ライン バ ン ド ル 化 バンドル化 バ ン ド ル 化 バンドルキュー バンドルキュー バンドルキュー

Slide 51

Slide 51 text

51 確認までの待ち時間 アセットバンドルがコンフリクトしないように 整合性を保つために1レーン運用 1ライン バ ン ド ル 化 バンドル化 バ ン ド ル 化 バンドルキュー バンドルキュー バンドルキュー アセットバンドル焼き待ちの 行列ができている!

Slide 52

Slide 52 text

52 直接実機に送信 自分のPCからアセットバンドルを作って 直接端末に送信

Slide 53

Slide 53 text

53 送信方法 PlayerConnectionクラス Editorからのデータを受信 https://docs.unity3d.com/ja/2020.3/ScriptReference/Networking.Player Connection.PlayerConnection.html EditorConnectionクラス Editor→端末にデータを送信 https://docs.unity3d.com/ja/current/ScriptReference/Networking.Player Connection.EditorConnection.html

Slide 54

Slide 54 text

54 送信方法 PlayerConnectionクラス 受信したバイナリデータを元に アセットバンドルをロードする EditorConnectionクラス 送信したいアセットのバンドルを作成 バンドルのバイナリデータを送信

Slide 55

Slide 55 text

55 前提 エフェクトPrefabごとにアセットバンドル化されている エフェクトPrefab_A エフェクトPrefab_B エフェクトAバンドル エフェクトBバンドル

Slide 56

Slide 56 text

56 Code 修正したエフェクトだけを送信して すぐに実機で確認できる

Slide 57

Slide 57 text

57 Code 修正したエフェクトだけを送信して すぐに実機で確認できる 修正イテレーションの高速化

Slide 58

Slide 58 text

アセット送信の応用

Slide 59

Slide 59 text

59 新規プラットフォーム 新しいプラットフォームでも 動くようにしてよ 偉い人 !!

Slide 60

Slide 60 text

60 新規プラットフォーム追加の課題 アセットサーバー 9年分のアセット 長年運用で積み重なった 大量のアセットが必要

Slide 61

Slide 61 text

61 新規プラットフォーム追加の課題 9年分のアセット アセットサーバー プラットフォームA プラットフォームB プラットフォームごとに バンドルを作らないといけない

Slide 62

Slide 62 text

62 新規プラットフォーム追加の課題 9年分のアセット アセットサーバー プラットフォームA プラットフォームB プラットフォームごとに バンドルを作らないといけない 全部焼き直すと 時間がかかりすぎる (サーバーも用意しないといけないし...)

Slide 63

Slide 63 text

63 自動アセット送信くん 実機でアセットエラーが出たら Editorでバンドルを作って送ってもらえば よいのでは!?

Slide 64

Slide 64 text

64 自動アセット送信くん 接続 新規プラットフォームA UnityEditor 事前にConnectionクラスを使って Editorと実機を繋ぐ

Slide 65

Slide 65 text

65 自動アセット送信くん [404] xxxのアセットがないよ! 新規プラットフォームA UnityEditor ローカルにアセットがなければ Editor側に404のイベントを飛ばす

Slide 66

Slide 66 text

66 自動アセット送信くん アセットバンドルを作って 送信する 新規プラットフォームA UnityEditor 404のアセットをEditor側でバンドル化して 実機に送信する

Slide 67

Slide 67 text

67 自動アセット送信くん 新規プラットフォームB 新規プラットフォームA 新規プラットフォームの追加や モック開発などを高速化できる UnityEditor

Slide 68

Slide 68 text

68 まとめ 1 2 3 4 メモリ計測の自動化 Jenkinsと設定ファイルを使った自動実行 スキルメモリ問題の見える化 メモリが膨れるポイント3つ 修正イテレーションの高速化 直接バンドルを送信して確認 アセット送信の応用 実機にアセットがなければEditorから送信

Slide 69

Slide 69 text

イベントページリンク