UAssetManager::UnloadPrimaryAssets() на них? Храню только в TSoftObjectPtr
Вот как я их загружаю и выгружаю (SharedPtr<FStreamableHandle> loadHandle и TArray<TSoftObjectPtr<UMyDataAsset>> myDataAssets - поля UMyAssetManager, проверки опущены):
void UMyAssetManager::PostInitialAssetScan()
{
Super::PostInitialAssetScan();
loadHandle = LoadPrimaryAssetsWithType(UMyDataAsset::assetType, {},
FStreamableDelegate::CreateUObject(this, &UMyAssetManager::OnDataAssetsLoaded));
}
void UMyAssetManager::OnDataAssetsLoaded()
{
int32 loadedNum, requestedNum;
loadHandle->GetLoadedCount(loadedNum, requestedNum);
TArray<UObject*> loadedAssets;
loadHandle->GetLoadedAssets(loadedAssets);
TArray<FPrimaryAssetId> assetsToUnload;
for (auto* loadedAsset : loadedAssets) {
if (auto* myDataAsset{ ExactCast<UMyDataAsset>(loadedAsset) }) {
myDataAssets.Emplace(myDataAsset);
assetsToUnload.Add(myDataAsset->GetPrimaryAssetId());
}
}
loadHandle->ReleaseHandle();
loadHandle.Reset();
int32 unLoadedNum{ UnloadPrimaryAssets(assetsToUnload) };
//unLoadedNum == loadedNum == requestedNum;
}
Через время они все еще валидны
У тебя ассет только помечается как тот, что можна удалить из памяти. loadHandle.Reset(); не поможет, так, как GarbageCollector сработает в неопределенный момент, то-есть теоретически можно попробовать вызвать: GEngine→ForceGarbageCollection(true) И то, это не гарантирует полное удаление ассета из памяти! Советую ознакомиться с этим в целом, если еще не видели. https://habr.com/ru/articles/661469/
Да просто название функции как-бы намекает, что они все-таки выгружаются, а не просто помечаются. Ее тело и впрямь выглядит как просто пометка, но мда. Спасибо
Ну там очень много нюансов может быть. К примеру: Загружаем BP, создаём инстанс, удаляем инстанс, выгружаем ассет, но BP все еще в памяти будет, к примеру секунд так 30. Соответственно AssetManager никак не сможет выгрузить его. Это к примеру, но в целом там не все так просто.
Так а отлаживать как тогда такие вещи) Вдруг это я где-то накосячил
Добавление myDataAsset->MarkPendingKill(); помогло, мда
gc.forcecollectgarbageeveryframe
Ну так вопрос в дебаге:D просто что бы убедиться что все уходит из памяти
Хотя похоже, что проблема просто в том, что это PIE. Но с упаковкой мне сейчас лень разбираться, поэтому пока оставлю
Обсуждают сегодня