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. AssetBundleの問題点 皆が困っている事や求めている機能について

  2. 1 1. ロード周り

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

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

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

    • カウンタが0になった時に実際にUnload(true)を呼ぶ • Unload(false)したい場合は実装者側が頑張るしかない 4
  6. 5 2. キャッシュ・世代管理

  7. キャッシュ・世代管理 • Unity標準のキャッシュ管理が雑で使いにくい • キャッシュの個別削除ができなかったりした • 更新したのに古いAssetBundleがキャッシュに残る • Caching.readyが遅い •

    有効期限の設定が不自由 • Unity2017~は色々改善された模様 • APIが増え、個別削除ができるように • パフォーマンスはどうなんだろう • 未調査 6
  8. キャッシュ・世代管理 • AssetBundleを差し替えた場合、クライアント側は新しいAssetBundleをDLしキャッシュを更 新する必要がある • ハッシュ値などを用いて更新判定 • 配信にCDN(CloudFront)を使うため、更新時はキャッシュ回避のためにファイル名を変える 必要がある •

    AssetBundle名に対応するURLの管理が必要 →サーバー側とクライアント側で世代情報を同期する必要がある 7
  9. 担当アプリでの実装 • AssetBundle命名ルール:末尾にハッシュ値を付ける • 更新の度にユニークなファイル名になるように • 静的ファイル「AssetInfo」をAssetBundleビルド時に生成 • 全てのAssetBundle名、依存関係、CRCなどの情報をシリアライズ •

    暗号化している 8
  10. 担当アプリでの実装 • サーバー側 • AssetInfoをS3→CloudFrontで配信 • ゲームサーバー上でAssetInfoのURLを管理 • 現在はビルドする度に手動でアップロード&更新している… •

    クライアント側 • ログイン時にサーバーから最新のAssetInfoのURLを取得 • AssetInfoをDLし、ResourceService(管理用クラス)を初期化 • あとはロード時にAssetInfoの情報を使ってよしなにしてくれる • 更新時には再ログインさせる(いわゆるデータロード) 9
  11. オルタナティブガールズでの例 AssetBundle配信をマイクロサービス化 参考:複雑化するAssetBundleの配信からロードまでを基盤化した話【CEDEC 2017】 10

  12. 11 3. ビルド〜デプロイ

  13. ビルド〜デプロイ • ビルドスクリプトが独自実装だとJenkinsの設定なども共通化できない • 共通化することで解決 • 更新時はファイル名を変える必要がある→命名のルール化 • 世代情報の更新も必要 •

    個別ビルド、差分ビルド対応 • コミット→ビルド→デプロイの自動化 12
  14. 13 その他

  15. 14 テスト環境 • ローカルのAssetBundleを読み込む • ステージングのAssetBundleを読み込む • AssetBundleをビルドせずにテストできるシミュレーションモード アセット暗号化 •

    AssetBundleは簡単に展開されてアセットを抽出できてしまうので防ぐ
  16. 参考資料 • Unity - アセットバンドルの基礎 • Unity - AssetBundle usage

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