Files
UnrealEngine/Engine/Source/Runtime/AssetRegistry/Private/NonBufferingReadOnlyArchive.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

81 lines
2.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Containers/StringFwd.h"
#include "HAL/FileManager.h"
#include "Serialization/ArchiveUObject.h"
/*
* This archive uses non-buffered IO to avoid overhead caused by reading into the OS cache manager
* rather than not reading into an archive owned buffer (it does that). It is intended to be
* used when reads will occur in parallel, contention would be caused at an OS level to allocate cache pages,
* and typically the whole file is not read sequentially but instead only a smaller portion of the file
* is needed (otherwise OS caching likely performs better since it can predict more accurately without waste).
* This archive is intended to be re-usable by opening new files on top so the internal buffer can be re-used.
*/
class FNonBufferingReadOnlyArchive : public FArchive
{
public:
FNonBufferingReadOnlyArchive(int64 InBufferSize = 4096, uint32 InFlags = 0);
~FNonBufferingReadOnlyArchive();
// FArchive API
virtual void Seek(int64 InPos) override final;
virtual int64 Tell() override final
{
return Pos;
}
virtual int64 TotalSize() override final
{
return Size;
}
virtual bool Close() override final;
virtual void Serialize(void* V, int64 Length) override final;
virtual FString GetArchiveName() const override
{
return Filename;
}
virtual bool Precache(int64 PrecacheOffset, int64 PrecacheSize) override;
//End FArchive API
/** Open a new file to read with this archive. Any existing open file is closed and the archive is reset. */
bool OpenFile(const TCHAR* InFilename);
protected:
/** Populates the internal buffer to read from during Serialize. */
bool InternalPrecache(int64 PrecacheOffset, int64 PrecacheSize);
/**
* Platform specific seek
* @param InPos - Offset from beginning of file to seek to
* @return false on failure
**/
bool SeekLowLevel(int64 InPos);
/** Open the file handle */
void OpenFileLowLevel(const TCHAR* InFilename);
/** Close the file handle **/
void CloseLowLevel();
/** Platform specific read */
void ReadLowLevel(uint8* Dest, int64 CountToRead, int64& OutBytesRead);
/** Returns true if the archive should suppress logging in case of error */
bool IsSilent() const
{
return !!(Flags & EFileRead::FILEREAD_Silent);
}
FString Filename;
int64 Size;
int64 Pos;
int64 BufferBase;
TUniquePtr<IFileHandle> Handle;
uint8* Buffer;
int64 BufferReadAlignment;
int64 BufferSize;
uint32 Flags;
};