CyberAgentGameEntertainment/SmartAddresser

[Bug] AddressableのGroupsウインドウを開きながらアドレスを割り当てを実行すると長時間フリーズする

Rapilias opened this issue · 1 comments

概要

AddressableのGroupsウインドウが開いている状態でLayoutRuleEditor -> Apply to Addressables を実行すると、Groupが探索するファイル数によって数秒 ~ 数十秒程度のフリーズを引き起こします。

再現手順

  1. Addressableの単一のグループを作成する
  2. LayoutRuleEditorからObjectFilterを作成して適当なフォルダを1つ割り当てる
  3. フォルダ内にデフォルトのCubeのプレハブを1500個程度用意する
    3.1 Ctrl+A -> Ctrl+Dを繰り返して50を超えたらエクスプローラーからのコピーに切り替える
  4. LayoutRuleEditorからApply to Addressablesを実行して初回割り当てを行う
  5. 再度 Apply to Addressables して即座に完了する
  6. Window -> Asset Management -> Addressable -> Groups ウインドウを開く
  7. Apply to Addressables すると4~ 5秒程度フリーズする

3000個の時は30秒近くフリーズする

環境

OS: Windows11
Unity: 2020.3.40f1, 2023.2.3f1
Addressables: 1.18.19, 2.0.6

回避策

Addressables Groupsのウインドウを開かない

追加情報

手元の問題が起きているプロジェクト(2023.3f1)をDeepProfilingに掛けた所、
スクリーンショット 2023-12-22 073809
TryAddEntry(), RemoveAllEntries()がファイル毎にAddressableAssetGroup.SetDirty()経由で再描画を走らせているようです。
Rapilias#5 で検証中ですが、Addressableが持っている

// AddressableAssetGroup
internal void RemoveAssetEntries(IEnumerable<AddressableAssetEntry> removeEntries, bool postEvent = true)
// AddressableAssetSettings
internal void CreateOrMoveEntries(IEnumerable guids, AddressableAssetGroup targetParent, List<AddressableAssetEntry> createdEntries, List<AddressableAssetEntry> movedEntries, bool readOnly = false, bool postEvent = true)

をリフレクション経由で呼び出して一括処理することでそれなりに改善されますが、SetLabelを一括で行う方法を見つけられず、解決には至っていません。

v1.0.5でリリースしました、ありがとうございました!

https://github.com/CyberAgentGameEntertainment/SmartAddresser/releases/tag/1.0.5