65 lines
1.8 KiB
C++
65 lines
1.8 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "FixedFrameRateCustomTimeStep.h"
|
|
|
|
#include "Misc/App.h"
|
|
#include "Stats/StatsMisc.h"
|
|
|
|
#include "HAL/PlatformProcess.h"
|
|
|
|
#include UE_INLINE_GENERATED_CPP_BY_NAME(FixedFrameRateCustomTimeStep)
|
|
|
|
UFixedFrameRateCustomTimeStep::UFixedFrameRateCustomTimeStep(const FObjectInitializer& ObjectInitializer)
|
|
: Super(ObjectInitializer)
|
|
{
|
|
}
|
|
|
|
FString UFixedFrameRateCustomTimeStep::GetDisplayName() const
|
|
{
|
|
const FString PlainName = GetFName().GetPlainNameString();
|
|
const FText FrameRate = GetFixedFrameRate().ToPrettyText();
|
|
const int32 NameIndex = GetFName().GetNumber();
|
|
|
|
return FString::Printf(TEXT("%s %s (%d)"), *PlainName, *FrameRate.ToString(), NameIndex);
|
|
}
|
|
|
|
void UFixedFrameRateCustomTimeStep::WaitForFixedFrameRate() const
|
|
{
|
|
UpdateApplicationLastTime();
|
|
|
|
const double CurrentTime = FPlatformTime::Seconds();
|
|
|
|
const FFrameRate FrameRate = GetFixedFrameRate();
|
|
|
|
// Calculate delta time
|
|
const double DeltaRealTime = CurrentTime - FApp::GetLastTime();
|
|
const double WaitTime = FMath::Max(FrameRate.AsInterval() - DeltaRealTime, 0.0);
|
|
|
|
double ActualWaitTime = 0.0;
|
|
{
|
|
FSimpleScopeSecondsCounter ActualWaitTimeCounter(ActualWaitTime);
|
|
|
|
if (WaitTime > 5.f / 1000.f)
|
|
{
|
|
FPlatformProcess::SleepNoStats((float)WaitTime - 0.002f);
|
|
}
|
|
|
|
// Give up timeslice for remainder of wait time.
|
|
const double WaitEndTime = FApp::GetLastTime() + FApp::GetDeltaTime();
|
|
while (FPlatformTime::Seconds() < WaitEndTime)
|
|
{
|
|
FPlatformProcess::SleepNoStats(0.f);
|
|
}
|
|
}
|
|
|
|
// Use fixed delta time and update time.
|
|
FApp::SetDeltaTime(FrameRate.AsInterval());
|
|
FApp::SetIdleTime(ActualWaitTime);
|
|
FApp::SetCurrentTime(FApp::GetLastTime() + FApp::GetDeltaTime());
|
|
}
|
|
|
|
FFrameRate UFixedFrameRateCustomTimeStep::GetFixedFrameRate_PureVirtual() const
|
|
{
|
|
return FFrameRate(24, 1);
|
|
}
|