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
AssetBundleの問題点 / Problems of AssetBundle
Search
k7a
March 20, 2018
Programming
0
590
AssetBundleの問題点 / Problems of AssetBundle
社内で発表したものを公開用に調整
k7a
March 20, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
TypeScriptでDXを上げろ! Hono編
yusukebe
3
770
初学者でも今すぐできる、Claude Codeの生産性を10倍上げるTips
s4yuba
16
13k
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
0
260
新メンバーも今日から大活躍!SREが支えるスケールし続ける組織のオンボーディング
honmarkhunt
5
8.7k
AIと”コードの評価関数”を共有する / Share the "code evaluation function" with AI
euglena1215
1
180
システム成長を止めない!本番無停止テーブル移行の全貌
sakawe_ee
1
360
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
680
AI Agent 時代のソフトウェア開発を支える AWS Cloud Development Kit (CDK)
konokenj
6
800
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
320
可変変数との向き合い方 $$変数名が踊り出す$$ / php conference Variable variables
gunji
0
180
レベル1の開発生産性向上に取り組む − 日々の作業の効率化・自動化を通じた改善活動
kesoji
0
300
AI時代のソフトウェア開発を考える(2025/07版) / Agentic Software Engineering Findy 2025-07 Edition
twada
PRO
99
37k
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Designing Experiences People Love
moore
142
24k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Speed Design
sergeychernyshev
32
1k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
It's Worth the Effort
3n
185
28k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Become a Pro
speakerdeck
PRO
29
5.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Building Adaptive Systems
keathley
43
2.7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.7k
Transcript
AssetBundleの問題点 皆が困っている事や求めている機能について
1 1. ロード周り
ロード周り - 依存関係解決 • 依存関係のある場合のロード • AB1のマテリアルAをロードする時、 AB2もロードする必要がある • マテリアルAのロード前に
全部ロードされていればOK • Unity5.x~ではAssetBundleManifestを使うのがスタンダード • ビルド時に生成される • GetAllDependenciesで依存関係が解決できる • アプリ起動時にAssetBundleとして読み込んで使う 2
ロード周り - アンロード管理 • AssetBundle.Unload(bool unloadAllLoadedObjects) • false: AssetBundleのみ解放する •
展開したアセットは解放されない • Unload(false)した後、同じアセットをロードするとメモリに二重に乗る • 二重ロードさえ気を付ければメモリが節約できる • アセットは参照が切れた後Resources.UnloadUnusedAssetsで解放される • true: 展開したアセットも解放する • 使用中でも容赦なく解放される • →全ての参照が切れてから行う必要がある • 依存関係が絡むと、意識して管理するのは難しい 3
ロード周り - アンロード管理 よくある実装 • Managerクラスを作って参照カウンタを用いて管理 • ロード時に+1 • アンロード時に-1
• カウンタが0になった時に実際にUnload(true)を呼ぶ • Unload(false)したい場合は実装者側が頑張るしかない 4
5 2. キャッシュ・世代管理
キャッシュ・世代管理 • Unity標準のキャッシュ管理が雑で使いにくい • キャッシュの個別削除ができなかったりした • 更新したのに古いAssetBundleがキャッシュに残る • Caching.readyが遅い •
有効期限の設定が不自由 • Unity2017~は色々改善された模様 • APIが増え、個別削除ができるように • パフォーマンスはどうなんだろう • 未調査 6
キャッシュ・世代管理 • AssetBundleを差し替えた場合、クライアント側は新しいAssetBundleをDLしキャッシュを更 新する必要がある • ハッシュ値などを用いて更新判定 • 配信にCDN(CloudFront)を使うため、更新時はキャッシュ回避のためにファイル名を変える 必要がある •
AssetBundle名に対応するURLの管理が必要 →サーバー側とクライアント側で世代情報を同期する必要がある 7
担当アプリでの実装 • AssetBundle命名ルール:末尾にハッシュ値を付ける • 更新の度にユニークなファイル名になるように • 静的ファイル「AssetInfo」をAssetBundleビルド時に生成 • 全てのAssetBundle名、依存関係、CRCなどの情報をシリアライズ •
暗号化している 8
担当アプリでの実装 • サーバー側 • AssetInfoをS3→CloudFrontで配信 • ゲームサーバー上でAssetInfoのURLを管理 • 現在はビルドする度に手動でアップロード&更新している… •
クライアント側 • ログイン時にサーバーから最新のAssetInfoのURLを取得 • AssetInfoをDLし、ResourceService(管理用クラス)を初期化 • あとはロード時にAssetInfoの情報を使ってよしなにしてくれる • 更新時には再ログインさせる(いわゆるデータロード) 9
オルタナティブガールズでの例 AssetBundle配信をマイクロサービス化 参考:複雑化するAssetBundleの配信からロードまでを基盤化した話【CEDEC 2017】 10
11 3. ビルド〜デプロイ
ビルド〜デプロイ • ビルドスクリプトが独自実装だとJenkinsの設定なども共通化できない • 共通化することで解決 • 更新時はファイル名を変える必要がある→命名のルール化 • 世代情報の更新も必要 •
個別ビルド、差分ビルド対応 • コミット→ビルド→デプロイの自動化 12
13 その他
14 テスト環境 • ローカルのAssetBundleを読み込む • ステージングのAssetBundleを読み込む • AssetBundleをビルドせずにテストできるシミュレーションモード アセット暗号化 •
AssetBundleは簡単に展開されてアセットを抽出できてしまうので防ぐ
参考資料 • Unity - アセットバンドルの基礎 • Unity - AssetBundle usage
patterns • 【Unity】AssetBundleの個別削除に関する覚書【AssetBundle】 - Qiita • 他社事例など • Unity-Technologies / AssetBundleDemo — Bitbucket • 使いやすい API 設計 - Tech Inside Drecom • AssetBundle設計のとある形 – てっくぼっと! • 複雑化するAssetBundleの配信からロードまでを基盤化した話【CEDEC 2017】 15