Files
UnrealEngine/Engine/Source/Runtime/StateStream/Private/StateStreamManagerImpl.cpp
2025-05-18 13:04:45 +08:00

226 lines
4.5 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "StateStreamManagerImpl.h"
#include "StateStreamCreator.h"
#include "StateStreamDebugRenderer.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
void FStateStreamManagerImpl::Game_BeginTick()
{
check(!bIsInTick);
check (!bGameExited);
bIsInTick = true;
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Game_BeginTick();
}
}
void FStateStreamManagerImpl::Game_EndTick(double AbsoluteTime)
{
check(bIsInTick);
bIsInTick = false;
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Game_EndTick(AbsoluteTime);
}
}
void FStateStreamManagerImpl::Game_Exit()
{
check(!bIsInTick);
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Game_Exit();
}
bGameExited = true;
}
bool FStateStreamManagerImpl::Game_IsInTick()
{
return bIsInTick;
}
void* FStateStreamManagerImpl::Game_GetStreamPointer(uint32 Id)
{
check(Id < uint32(StateStreamsLookup.Num()));
return StateStreamsLookup[Id]->Game_GetVoidPointer();
}
void FStateStreamManagerImpl::Render_Register(IStateStream& Stream, bool TakeOwnership)
{
StateStreamRec Rec { &Stream, TakeOwnership };
StateStreams.Add(Rec);
uint32 Id = Stream.GetId();
if (uint32(StateStreamsLookup.Num()) <= Id)
{
StateStreamsLookup.SetNum(Id+1);
}
check(StateStreamsLookup[Id] == nullptr);
StateStreamsLookup[Id] = &Stream;
}
void FStateStreamManagerImpl::Render_RegisterDependency(uint32 FromId, uint32 ToId)
{
// TODO
}
void FStateStreamManagerImpl::Render_RegisterDependency(IStateStream& From, IStateStream& To)
{
Render_RegisterDependency(From.GetId(), To.GetId());
}
void FStateStreamManagerImpl::Render_Update(double AbsoluteTime)
{
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Render_Update(AbsoluteTime);
}
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Render_PostUpdate();
}
}
void FStateStreamManagerImpl::Render_Exit()
{
GarbageCollectTask.Wait();
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Render_Exit();
}
bRenderExited = true;
}
void FStateStreamManagerImpl::Render_GarbageCollect(bool AsTask)
{
GarbageCollectTask.Wait();
auto Func = [this]()
{
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->Render_GarbageCollect();
}
};
if (AsTask)
{
GarbageCollectTask = UE::Tasks::Launch(UE_SOURCE_LOCATION, MoveTemp(Func));
}
else
{
Func();
}
}
IStateStream* FStateStreamManagerImpl::Render_GetStream(uint32 Id)
{
check(Id < uint32(StateStreamsLookup.Num()));
return StateStreamsLookup[Id];
}
void FStateStreamManagerImpl::Game_DebugRender(IStateStreamDebugRenderer& Renderer)
{
for (const StateStreamRec& Rec : StateStreams)
{
Rec.Stream->DebugRender(Renderer);
}
}
FStateStreamManagerImpl::~FStateStreamManagerImpl()
{
for (const StateStreamRec& Rec : StateStreams)
{
if (Rec.Owned)
{
delete Rec.Stream;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
FStateStreamCreator* FStateStreamCreator::First;
FStateStreamCreator::FStateStreamCreator(uint32 Id_, FRegisterFunction&& InRegisterFunction, FUnregisterFunction&& InUnregisterFunction)
: RegisterFunction(MoveTemp(InRegisterFunction))
, UnregisterFunction(MoveTemp(InUnregisterFunction))
, Id(Id_)
{
Prev = nullptr;
for (FStateStreamCreator* It=First; It; It=It->Next)
{
if (Id < It->Id)
break;
Prev = It;
}
if (!Prev)
{
Next = First;
First = this;
}
else
{
Next = Prev->Next;
Prev->Next = this;
}
if (Next)
{
Next->Prev = this;
}
}
FStateStreamCreator::~FStateStreamCreator()
{
if (Next)
{
Next->Prev = Prev;
}
if (Prev)
{
Prev->Next = Next;
}
else
{
First = Next;
}
Next = nullptr;
Prev = nullptr;
}
void FStateStreamCreator::RegisterStateStreams(const FStateStreamRegisterContext& Context)
{
for (FStateStreamCreator* It=First; It; It=It->Next)
{
It->RegisterFunction(Context);
}
}
void FStateStreamCreator::UnregisterStateStreams(const FStateStreamUnregisterContext& Context)
{
for (FStateStreamCreator* It=First; It; It=It->Next)
{
It->UnregisterFunction(Context);
}
}
void FStateStreamRegisterContext::Register(IStateStream& StateStream, bool TakeOwnership) const
{
Manager.Render_Register(StateStream, TakeOwnership);
}
void FStateStreamRegisterContext::RegisterDependency(uint32 FromId, uint32 ToId) const
{
Manager.Render_RegisterDependency(FromId, ToId);
}
////////////////////////////////////////////////////////////////////////////////////////////////////