$30 off During Our Annual Pro Sale. View Details »

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

COLOPL Inc.
September 19, 2023
160

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

COLOPL Inc.

September 19, 2023
Tweet

More Decks by COLOPL Inc.

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 4
    白猫について

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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





    バンドル化




    化 バンドルキュー
    バンドルキュー
    バンドルキュー

    View Slide

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





    バンドル化




    化 バンドルキュー
    バンドルキュー
    バンドルキュー
    アセットバンドル焼き待ちの
    行列ができている!

    View Slide

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

    View Slide

  53. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  58. アセット送信の応用

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  69. イベントページリンク

    View Slide