Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 42 additions & 4 deletions Engine/Source/Core/Application/ApplicationClock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,15 @@
#include <algorithm>
#include <cmath>
#include <stdexcept>
#include <string>

namespace WaveApplication
{
namespace
{
constexpr uint8 VariableWarmupSampleBudget = 3;
}

FApplicationClock::FApplicationClock(FApplicationTimingConfig InConfig)
: Config(std::move(InConfig))
{
Expand Down Expand Up @@ -51,19 +57,41 @@ namespace WaveApplication
}

FApplicationClockSample Sample;
bool bWarmupClamp = false;
Sample.TickSequence = TickSequence;
Sample.RealTimeSeconds = MonotonicSeconds;
Sample.bFirstTick = !PreviousSeconds.has_value();
Sample.RealDeltaSeconds = PreviousSeconds
? MonotonicSeconds - *PreviousSeconds
: 1.0 / 60.0;
Sample.GameDeltaSeconds = std::min(Sample.RealDeltaSeconds, Config.MaxDeltaSeconds);
Sample.bClamped = Sample.RealDeltaSeconds > Config.MaxDeltaSeconds;
if (Config.FixedDeltaSeconds)
{
Sample.GameDeltaSeconds = *Config.FixedDeltaSeconds;
Sample.bFixed = true;
}
else
{
Sample.GameDeltaSeconds = std::min(
Sample.RealDeltaSeconds,
Config.MaxDeltaSeconds);
Sample.bClamped = Sample.RealDeltaSeconds > Config.MaxDeltaSeconds;
if (!Sample.bFirstTick)
{
bWarmupClamp = Sample.bClamped
&& !bVariableWarmupComplete
&& VariableWarmupSampleCount < VariableWarmupSampleBudget;
if (!Sample.bClamped)
{
bVariableWarmupComplete = true;
}
else if (!bVariableWarmupComplete)
{
++VariableWarmupSampleCount;
bVariableWarmupComplete =
VariableWarmupSampleCount >= VariableWarmupSampleBudget;
}
}
}

PreviousSeconds = MonotonicSeconds;
++TickSequence;
Expand All @@ -73,8 +101,16 @@ namespace WaveApplication
Result.Diagnostics.push_back({
"application.clock.delta_clamped",
"clock.game_delta_seconds",
"Variable game delta was clamped to the configured maximum.",
EApplicationDiagnosticSeverity::Warning,
std::string(bWarmupClamp
? "Startup warmup variable game delta of "
: "Variable game delta of ")
+ std::to_string(Sample.RealDeltaSeconds)
+ " seconds was clamped to the configured maximum of "
+ std::to_string(Config.MaxDeltaSeconds)
+ " seconds.",
bWarmupClamp
? EApplicationDiagnosticSeverity::Info
: EApplicationDiagnosticSeverity::Warning,
false,
});
}
Expand All @@ -85,5 +121,7 @@ namespace WaveApplication
{
PreviousSeconds.reset();
TickSequence = 0;
VariableWarmupSampleCount = 0;
bVariableWarmupComplete = false;
}
}
2 changes: 2 additions & 0 deletions Engine/Source/Core/Application/ApplicationClock.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,7 @@ namespace WaveApplication
FApplicationTimingConfig Config;
std::optional<double> PreviousSeconds;
uint64 TickSequence = 0;
uint8 VariableWarmupSampleCount = 0;
bool bVariableWarmupComplete = false;
};
}
68 changes: 54 additions & 14 deletions Engine/Source/UI/EditorApplication.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <string_view>
#include <system_error>
#include <utility>
Expand Down Expand Up @@ -683,19 +684,52 @@ namespace
return "unknown";
}

void LogApplicationDiagnostics(const FApplicationStatusSnapshot& Status)
std::string FormatApplicationDiagnostic(
const FApplicationDiagnostic& Diagnostic)
{
for (const FApplicationDiagnostic& Diagnostic : Status.Diagnostics)
{
Log::Error(
"Application diagnostic [",
DiagnosticSeverityName(Diagnostic.Severity),
"] ",
Diagnostic.Code,
" at ",
Diagnostic.Path,
": ",
Diagnostic.Message);
std::string Message = "Application diagnostic [";
Message += DiagnosticSeverityName(Diagnostic.Severity);
Message += "] ";
Message += Diagnostic.Code;
Message += " at ";
Message += Diagnostic.Path;
Message += ": ";
Message += Diagnostic.Message;
return Message;
}

void LogApplicationDiagnostic(const FApplicationDiagnostic& Diagnostic)
{
const std::string Message = FormatApplicationDiagnostic(Diagnostic);
switch (Diagnostic.Severity)
{
case EApplicationDiagnosticSeverity::Info:
Log::Info(Message);
break;
case EApplicationDiagnosticSeverity::Warning:
Log::Warning(Message);
break;
case EApplicationDiagnosticSeverity::Error:
case EApplicationDiagnosticSeverity::Fatal:
// Log::Fatal throws; lifecycle diagnostics have already selected the
// safe shutdown or quarantine path and must only be reported here.
Log::Error(Message);
break;
}
}

void LogNewApplicationDiagnostics(
const FApplicationStatusSnapshot& Status,
size_t& LoggedDiagnosticCount)
{
if (LoggedDiagnosticCount > Status.Diagnostics.size())
{
LoggedDiagnosticCount = 0;
}
while (LoggedDiagnosticCount < Status.Diagnostics.size())
{
LogApplicationDiagnostic(Status.Diagnostics[LoggedDiagnosticCount]);
++LoggedDiagnosticCount;
}
}
}
Expand Down Expand Up @@ -726,7 +760,10 @@ int RunEditorApplication()
Runner.RegisterService(AdapterService);

SET_THREAD_NAME("Main Thread");
if (Runner.Initialize(IdleCoordinator))
size_t LoggedDiagnosticCount = 0;
const bool bInitialized = Runner.Initialize(IdleCoordinator);
LogNewApplicationDiagnostics(Runner.QueryStatus(), LoggedDiagnosticCount);
if (bInitialized)
{
while (Runner.QueryStatus().State == EApplicationLifecycleState::Running)
{
Expand All @@ -742,13 +779,16 @@ int RunEditorApplication()
SCOPED_CPU_EVENT("Frame");
(void)Runner.Tick(GetMonotonicSeconds());
}
LogNewApplicationDiagnostics(
Runner.QueryStatus(),
LoggedDiagnosticCount);
GlobalContext.FrameIndex = Runner.QueryStatus().TickSequence;
}
Runner.Shutdown(IdleCoordinator);
}

const FApplicationStatusSnapshot& Status = Runner.QueryStatus();
LogApplicationDiagnostics(Status);
LogNewApplicationDiagnostics(Status, LoggedDiagnosticCount);
if (Status.State == EApplicationLifecycleState::Quarantined)
{
Log::Error(
Expand Down
15 changes: 15 additions & 0 deletions Engine/Source/UI/EditorWidgets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -775,6 +775,21 @@ void EditorWidgets::Icon(EEditorIcon EditorIcon, EEditorColor Color, float Size)
FEditorStyle::ColorU32(Color));
}

void EditorWidgets::IconAt(
ImDrawList* DrawList,
const ImVec2& Position,
EEditorIcon EditorIcon,
EEditorColor Color,
float Size)
{
DrawEditorIcon(
DrawList,
EditorIcon,
Position,
FEditorStyle::Scale(Size),
FEditorStyle::ColorU32(Color));
}

bool EditorWidgets::Button(
const char* Id,
EEditorIcon ButtonIcon,
Expand Down
6 changes: 6 additions & 0 deletions Engine/Source/UI/EditorWidgets.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ namespace EditorWidgets
EEditorIcon Icon,
EEditorColor Color = EEditorColor::TextMuted,
float Size = 16.0f);
void IconAt(
ImDrawList* DrawList,
const ImVec2& Position,
EEditorIcon Icon,
EEditorColor Color = EEditorColor::TextMuted,
float Size = 16.0f);

// Vector-icon buttons keep the same geometry for hover, pressed, disabled
// and keyboard-focus states. Id is never rendered and must be stable.
Expand Down
Loading