Files
UnrealEngineUWP/Engine/Source/Runtime/RuntimeAssetCache/Private/RuntimeAssetCacheAsyncWorker.h

134 lines
4.1 KiB
C
Raw Normal View History

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3209340 on 2016/11/23 by Ben.Marsh Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h. Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms. * Every header now includes everything it needs to compile. * There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first. * There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h. * Every .cpp file includes its matching .h file first. * This helps validate that each header is including everything it needs to compile. * No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more. * You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there. * There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible. * No engine code explicitly includes a precompiled header any more. * We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies. * PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files. Tool used to generate this transform is at Engine\Source\Programs\IncludeTool. [CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
#include "CoreMinimal.h"
#include "Containers/UnrealString.h"
#include "UObject/NameTypes.h"
#include "Stats/Stats.h"
#include "Async/AsyncWork.h"
#include "RuntimeAssetCacheInterface.h"
#include "RuntimeAssetCachePrivate.h"
class FRuntimeAssetCacheBucket;
class IRuntimeAssetCacheBuilder;
class UClass;
/** Stats */
DECLARE_DWORD_ACCUMULATOR_STAT_EXTERN(TEXT("RAC Num Build"), STAT_RAC_NumBuilds, STATGROUP_RAC, );
DECLARE_DWORD_ACCUMULATOR_STAT_EXTERN(TEXT("RAC Num Cache Hits"), STAT_RAC_NumCacheHits, STATGROUP_RAC, );
DECLARE_DWORD_ACCUMULATOR_STAT_EXTERN(TEXT("RAC Num Retrieve fails"), STAT_RAC_NumFails, STATGROUP_RAC, );
DECLARE_DWORD_ACCUMULATOR_STAT_EXTERN(TEXT("RAC Num Gets"), STAT_RAC_NumGets, STATGROUP_RAC, );
DECLARE_DWORD_ACCUMULATOR_STAT_EXTERN(TEXT("RAC Num Puts"), STAT_RAC_NumPuts, STATGROUP_RAC, );
/** Forward declarations. */
class IRuntimeAssetCacheBuilder;
class FRuntimeAssetCacheBucket;
/**
* Worker to retrieve entry from cache or build it in case of cache miss.
*/
class FRuntimeAssetCacheAsyncWorker : public FNonAbandonableTask
{
public:
/** Constructor */
FRuntimeAssetCacheAsyncWorker(IRuntimeAssetCacheBuilder* InCacheBuilder, TMap<FName, FRuntimeAssetCacheBucket*>* InBuckets, int32 InHandle, const FOnRuntimeAssetCacheAsyncComplete& InCompletionCallback);
/** Async task interface implementation. */
void DoWork();
TStatId GetStatId() const;
/** End of async task interface implementation. */
/** Gets serialized cache data. */
void* GetData()
{
return Data;
}
/** Gets serialized cache data size in bytes. */
int64 GetDataSize()
{
return DataSize;
}
/** Gets serialized cache data and data size. */
FVoidPtrParam GetDataAndSize()
{
return FVoidPtrParam(Data, DataSize);
}
/**
* Fires completion delegate only if it wasn't fired earlier.
*/
void FireCompletionDelegate();
private:
/**
* Checks if task already fired completion delegate.
* @return true if already fired completion delegate, false otherwise.
*/
bool FiredCompletionDelegate() const
{
return bFiredCompletionDelegate;
}
/**
* Static function to make sure a cache key contains only legal characters by using an escape.
* @param CacheKey Cache key to sanitize
* @return Sanitized cache key
**/
static FString SanitizeCacheKey(const TCHAR* CacheKey);
/**
* Static function to build a cache key out of the plugin name, versions and plugin specific info
* @param PluginName Name of the runtime asset data type
* @param VersionString Version string of the runtime asset data
* @param PluginSpecificCacheKeySuffix Whatever is needed to uniquely identify the specific cache entry.
* @return Assembled cache key
**/
static FString BuildCacheKey(const TCHAR* VersionString, const TCHAR* PluginSpecificCacheKeySuffix);
/**
* Static function to build a cache key out of the CacheBuilder.
* @param CacheBuilder Builder to create key from.
* @return Assembled cache key
**/
static FString BuildCacheKey(IRuntimeAssetCacheBuilder* CacheBuilder);
/**
* Removes entries from cache until given number of bytes are freed (or more).
* @param Bucket Bucket to clean up.
* @param SizeOfSpaceToFreeInBytes Number of bytes to free (or more).
*/
void FreeCacheSpace(FName Bucket, int32 SizeOfSpaceToFreeInBytes);
/** Cache builder to create cache entry in case of cache miss. */
IRuntimeAssetCacheBuilder* CacheBuilder;
/** Data to return to caller. */
void* Data;
/** Size of data returned to caller */
int64 DataSize;
/** Reference to map of bucket names to their descriptions. */
TMap<FName, FRuntimeAssetCacheBucket*>* Buckets;
/**
* True if successfully retrieved a cache entry. Can be false only when CacheBuilder
* returns false or no CacheBuilder was provided.
*/
bool bEntryRetrieved;
/** Completion delegate called when cache entry is retrieved. */
FOnRuntimeAssetCacheAsyncComplete CompletionCallback;
/** Handle uniquely identifying this worker thread. */
int32 Handle;
/** True if completion delegate was already fired, false otherwise. */
bool bFiredCompletionDelegate;
UClass* Class;
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3209340) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3209340 on 2016/11/23 by Ben.Marsh Convert UE4 codebase to an "include what you use" model - where every header just includes the dependencies it needs, rather than every source file including large monolithic headers like Engine.h and UnrealEd.h. Measured full rebuild times around 2x faster using XGE on Windows, and improvements of 25% or more for incremental builds and full rebuilds on most other platforms. * Every header now includes everything it needs to compile. * There's a CoreMinimal.h header that gets you a set of ubiquitous types from Core (eg. FString, FName, TArray, FVector, etc...). Most headers now include this first. * There's a CoreTypes.h header that sets up primitive UE4 types and build macros (int32, PLATFORM_WIN64, etc...). All headers in Core include this first, as does CoreMinimal.h. * Every .cpp file includes its matching .h file first. * This helps validate that each header is including everything it needs to compile. * No engine code includes a monolithic header such as Engine.h or UnrealEd.h any more. * You will get a warning if you try to include one of these from the engine. They still exist for compatibility with game projects and do not produce warnings when included there. * There have only been minor changes to our internal games down to accommodate these changes. The intent is for this to be as seamless as possible. * No engine code explicitly includes a precompiled header any more. * We still use PCHs, but they're force-included on the compiler command line by UnrealBuildTool instead. This lets us tune what they contain without breaking any existing include dependencies. * PCHs are generated by a tool to get a statistical amount of coverage for the source files using it, and I've seeded the new shared PCHs to contain any header included by > 15% of source files. Tool used to generate this transform is at Engine\Source\Programs\IncludeTool. [CL 3209342 by Ben Marsh in Main branch]
2016-11-23 15:48:37 -05:00
};