Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
白猫キャラクタのメモリ問題と解決さ解決策
Search
COLOPL Inc.
September 19, 2023
0
370
白猫キャラクタのメモリ問題と解決さ解決策
COLOPL Inc.
September 19, 2023
Tweet
Share
More Decks by COLOPL Inc.
See All by COLOPL Inc.
大規模トラフィックを支える ゲームバックエンドの課題と構成の変遷 ~安定したゲーム体験を実現するために~
colopl
2
2.8k
長期運用プロジェクトでのMySQLからTiDB移行の検証
colopl
3
1.5k
ゲームを支えるバックエンドエンジニアのリアルを公開!
colopl
1
1.1k
コロプラ_SRE_LCE_ゲームバックエンド_性能との戦い
colopl
0
800
新卒3年目の ゲームバックエンドエンジニアが これまでに経験したこと
colopl
1
1.4k
大規模タイトルを ノーメンテで運用するコツ
colopl
1
1.3k
サーバーサイドエンジニアの ゲーム企画との向き合い方
colopl
1
1.3k
大規模/長期運用プロジェクト が抱える課題への チーム、個人の取り組み
colopl
1
1.2k
令和時代の PHP Extension の 作り方 〜 FFI を添えて〜
colopl
0
1.5k
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
It's Worth the Effort
3n
183
28k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
A Tale of Four Properties
chriscoyier
157
23k
Java REST API Framework Comparison - PWX 2021
mraible
28
8.3k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
810
Git: the NoSQL Database
bkeepers
PRO
427
64k
Automating Front-end Workflow
addyosmani
1366
200k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Making Projects Easy
brettharned
116
5.9k
Adopting Sorbet at Scale
ufuk
73
9.1k
Transcript
白猫キャラクタのメモリ問題と解決策
2 自己紹介 2017年 新卒でコロプラに入社 2017年〜 : 「クイズRPG 魔法使いと黒猫のウィズ」 2018年〜 :
「白猫プロジェクト」 主に運用で必要な新規機能開発や、 開発効率化のツール作成などを行っている 髙山 大輝 【 クライアントエンジニア 】 Takayama Daiki
3 おしながき 1 2 3 4 メモリ計測の自動化 スキルメモリ問題の見える化 修正イテレーションの高速化 アセット送信の応用
甘口
4 白猫について
5 白猫について ド派手なスキル演出!
6 白猫について キャラクタごとに使用できるメモリ量の レギュレーションが決まっている
7 キャラクタごとにメモリ計測 1 2 モデル キャラクタごとの メッシュやテクスチャなど アクション スキルごとの エフェクトやモーションなど
8 キャラクタごとにメモリ計測 1 2 モデル キャラクタごとの メッシュやテクスチャなど アクション スキルごとの エフェクトやモーションなど
手動計測
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大パターン 1 2 メッシュに不要な頂点情報が混じっている 3 テクスチャのサイズや設定が不適切 エフェクトのインスタンスが多い
30 よくあるメモリ問題3大パターン 1 2 メッシュに不要な頂点情報が混じっている 3 テクスチャのサイズや設定が不適切 エフェクトのインスタンスが多い データに変な設定がされていないかを 確認してもらう
31 参照確認ツール アセットの参照を取得するメソッド EditorUtility.CollectDependencies https://docs.unity3d.com/jp/current/ScriptReference/EditorUtility.CollectDependencies.html
32 参照確認ツール 参照しているアセットの詳細を表示するツール
33 参照確認ツール アセットの設定に問題が無いか簡単に確認できる
34 よくあるメモリ問題3大パターン 1 2 メッシュに不要な頂点情報が混じっている 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 デザイナに伝えるべき修正箇所 1 2 エフェクトごとの消費メモリ量 エフェクトごとのインスタンス数
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.Player Connection.PlayerConnection.html EditorConnectionクラス Editor→端末にデータを送信 https://docs.unity3d.com/ja/current/ScriptReference/Networking.Player Connection.EditorConnection.html
54 送信方法 PlayerConnectionクラス 受信したバイナリデータを元に アセットバンドルをロードする EditorConnectionクラス 送信したいアセットのバンドルを作成 バンドルのバイナリデータを送信
55 前提 エフェクトPrefabごとにアセットバンドル化されている エフェクトPrefab_A エフェクトPrefab_B エフェクトAバンドル エフェクトBバンドル
56 Code 修正したエフェクトだけを送信して すぐに実機で確認できる
57 Code 修正したエフェクトだけを送信して すぐに実機で確認できる 修正イテレーションの高速化
アセット送信の応用
59 新規プラットフォーム 新しいプラットフォームでも 動くようにしてよ 偉い人 !!
60 新規プラットフォーム追加の課題 アセットサーバー 9年分のアセット 長年運用で積み重なった 大量のアセットが必要
61 新規プラットフォーム追加の課題 9年分のアセット アセットサーバー プラットフォームA プラットフォームB プラットフォームごとに バンドルを作らないといけない
62 新規プラットフォーム追加の課題 9年分のアセット アセットサーバー プラットフォームA プラットフォームB プラットフォームごとに バンドルを作らないといけない 全部焼き直すと 時間がかかりすぎる
(サーバーも用意しないといけないし...)
63 自動アセット送信くん 実機でアセットエラーが出たら Editorでバンドルを作って送ってもらえば よいのでは!?
64 自動アセット送信くん 接続 新規プラットフォームA UnityEditor 事前にConnectionクラスを使って Editorと実機を繋ぐ
65 自動アセット送信くん [404] xxxのアセットがないよ! 新規プラットフォームA UnityEditor ローカルにアセットがなければ Editor側に404のイベントを飛ばす
66 自動アセット送信くん アセットバンドルを作って 送信する 新規プラットフォームA UnityEditor 404のアセットをEditor側でバンドル化して 実機に送信する
67 自動アセット送信くん 新規プラットフォームB 新規プラットフォームA 新規プラットフォームの追加や モック開発などを高速化できる UnityEditor
68 まとめ 1 2 3 4 メモリ計測の自動化 Jenkinsと設定ファイルを使った自動実行 スキルメモリ問題の見える化 メモリが膨れるポイント3つ
修正イテレーションの高速化 直接バンドルを送信して確認 アセット送信の応用 実機にアセットがなければEditorから送信
イベントページリンク