Files
UnrealEngine/Engine/Source/Runtime/AssetRegistry/Private/AssetRegistryArchive.h
2025-05-18 13:04:45 +08:00

92 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "AssetRegistry/AssetDataTagMapSerializationDetails.h"
#include "Serialization/LargeMemoryWriter.h"
#include "UObject/NameBatchSerialization.h"
struct FAssetData;
struct FAssetRegistrySerializationOptions;
// Header containing versioning & data stripping information for a serialized asset registry state.
struct FAssetRegistryHeader
{
FAssetRegistryVersion::Type Version = FAssetRegistryVersion::LatestVersion;
bool bFilterEditorOnlyData = false; // True if editor only data has been removed/should be removed while saving
void SerializeHeader(FArchive& Ar);
};
/** @see FAssetRegistryWriter */
class FAssetRegistryReader : public FArchiveProxy
{
public:
/// @param NumWorkers > 0 for parallel loading
FAssetRegistryReader(FArchive& Inner, int32 NumWorkers, FAssetRegistryHeader Header);
~FAssetRegistryReader();
virtual FArchive& operator<<(FName& Value) override;
void SerializeTagsAndBundles(FAssetData& Out);
void SerializeTagsAndBundlesOldVersion(FAssetData& Out, FAssetRegistryVersion::Type Version);
void WaitForTasks();
private:
TArray<FDisplayNameEntryId> Names;
TRefCountPtr<const FixedTagPrivate::FStore> Tags;
TFuture<void> Task;
friend FAssetDataTagMapSharedView LoadTags(FAssetRegistryReader& Reader);
};
#if ALLOW_NAME_BATCH_SAVING
class FAssetRegistryWriterBase
{
protected:
FLargeMemoryWriter MemWriter;
};
struct FAssetRegistryWriterOptions
{
FAssetRegistryWriterOptions() = default;
explicit FAssetRegistryWriterOptions(const FAssetRegistrySerializationOptions& Options);
FixedTagPrivate::FOptions Tags;
};
/**
* Indexes FName and tag maps and serializes out deduplicated indices instead.
*
* Unlike previous FNameTableArchiveWriter:
* - Name data stored as name batches, which is faster
* - Name batch is written as a header instead of footer for faster seek-free loading
* - Numberless FNames are serialized as a single 32-bit int
* - Deduplicates all tag values, not just names
*
* Use in conjunction with FNameBatchReader.
*
* Data is written to inner archive in destructor to achieve seek-free loading.
*/
class FAssetRegistryWriter : public FAssetRegistryWriterBase, public FArchiveProxy
{
public:
FAssetRegistryWriter(const FAssetRegistryWriterOptions& Options, FArchive& Out);
~FAssetRegistryWriter();
virtual FArchive& operator<<(FName& Value) override;
void SerializeTagsAndBundles(const FAssetData& In);
private:
TMap<FDisplayNameEntryId, uint32> Names;
FixedTagPrivate::FStoreBuilder Tags;
FArchive& TargetAr;
friend void SaveTags(FAssetRegistryWriter& Writer, const FAssetDataTagMapSharedView& Map);
};
#endif