Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AssetBundleの問題点 / Problems of AssetBundle

k7a
March 20, 2018

AssetBundleの問題点 / Problems of AssetBundle

社内で発表したものを公開用に調整

k7a

March 20, 2018
Tweet

Other Decks in Programming

Transcript

  1. ロード周り - 依存関係解決 • 依存関係のある場合のロード • AB1のマテリアルAをロードする時、 AB2もロードする必要がある • マテリアルAのロード前に

    全部ロードされていればOK • Unity5.x~ではAssetBundleManifestを使うのがスタンダード • ビルド時に生成される • GetAllDependenciesで依存関係が解決できる • アプリ起動時にAssetBundleとして読み込んで使う 2
  2. ロード周り - アンロード管理 • AssetBundle.Unload(bool unloadAllLoadedObjects) • false: AssetBundleのみ解放する •

    展開したアセットは解放されない • Unload(false)した後、同じアセットをロードするとメモリに二重に乗る • 二重ロードさえ気を付ければメモリが節約できる • アセットは参照が切れた後Resources.UnloadUnusedAssetsで解放される • true: 展開したアセットも解放する • 使用中でも容赦なく解放される • →全ての参照が切れてから行う必要がある • 依存関係が絡むと、意識して管理するのは難しい 3
  3. ロード周り - アンロード管理 よくある実装 • Managerクラスを作って参照カウンタを用いて管理 • ロード時に+1 • アンロード時に-1

    • カウンタが0になった時に実際にUnload(true)を呼ぶ • Unload(false)したい場合は実装者側が頑張るしかない 4
  4. キャッシュ・世代管理 • Unity標準のキャッシュ管理が雑で使いにくい • キャッシュの個別削除ができなかったりした • 更新したのに古いAssetBundleがキャッシュに残る • Caching.readyが遅い •

    有効期限の設定が不自由 • Unity2017~は色々改善された模様 • APIが増え、個別削除ができるように • パフォーマンスはどうなんだろう • 未調査 6
  5. 担当アプリでの実装 • サーバー側 • AssetInfoをS3→CloudFrontで配信 • ゲームサーバー上でAssetInfoのURLを管理 • 現在はビルドする度に手動でアップロード&更新している… •

    クライアント側 • ログイン時にサーバーから最新のAssetInfoのURLを取得 • AssetInfoをDLし、ResourceService(管理用クラス)を初期化 • あとはロード時にAssetInfoの情報を使ってよしなにしてくれる • 更新時には再ログインさせる(いわゆるデータロード) 9
  6. 参考資料 • Unity - アセットバンドルの基礎 • Unity - AssetBundle usage

    patterns • 【Unity】AssetBundleの個別削除に関する覚書【AssetBundle】 - Qiita • 他社事例など • Unity-Technologies / AssetBundleDemo — Bitbucket • 使いやすい API 設計 - Tech Inside Drecom • AssetBundle設計のとある形 – てっくぼっと! • 複雑化するAssetBundleの配信からロードまでを基盤化した話【CEDEC 2017】 15