18
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-11-15 01:25:11 +01:00
Files
maszyna/utilities/Timer.cpp
jerrrrycho 441caeed64 refactor(simulation): tidy the test mode code
The test manager is reached through simulation::test() instead of a global,
the result cell is owned by a unique_ptr until the memory table takes it, the
cell value is compared with a margin, strings are built with std::format and
the --test settings moved to apply_test_mode_settings(). The driver's signal
check is folded into UpdateSpeedPosition(), which updates a speed table entry
and reports a signal at stop the head of the train just passed. The test.*
keys are listed with the other settings at the start of the log.
2026-11-07 17:12:11 +01:00

139 lines
3.0 KiB
C++

/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
#include "stdafx.h"
#include "utilities/Timer.h"
#include "utilities/Globals.h"
#include "winheaders.h"
namespace Timer {
subsystem_stopwatches subsystem;
double DeltaTime = 0.0;
double DeltaRenderTime = 0.0;
double fFPS{ 0.0f };
double fLastTime{ 0.0f };
DWORD dwFrames{ 0 };
double fSimulationTime{ 0.0 };
double fRenderTime{ 0.0 };
double fSoundTimer{ 0.0 };
double fSinceStart{ 0.0 };
double override_delta = -1.0f;
namespace {
// when set (test mode), every frame lasts this long, see set_fixed_step()
double &fixed_step()
{
static double step{0.0};
return step;
}
} // namespace
double GetTime()
{
return fSimulationTime;
}
double GetRenderTime() {
return fRenderTime;
}
double GetDeltaTime()
{ // czas symulacji (stoi gdy pauza)
if (override_delta != -1.0f)
return override_delta;
return DeltaTime;
}
double GetDeltaRenderTime()
{ // czas renderowania (do poruszania się)
return DeltaRenderTime;
}
void set_delta_override(double t)
{
override_delta = t;
}
void set_fixed_step(double t)
{
fixed_step() = t;
}
void ResetTimers()
{
UpdateTimers( Global.iPause != 0 );
DeltaTime = 0.0;
DeltaRenderTime = 0.0;
}
uint64_t fr;
uint64_t count;
uint64_t oldCount;
void UpdateTimers(bool pause)
{
#ifdef _WIN32
QueryPerformanceFrequency((LARGE_INTEGER *)&fr);
QueryPerformanceCounter((LARGE_INTEGER *)&count);
#elif __unix__
timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
count = (uint64_t)ts.tv_sec * 1000000000 + (uint64_t)ts.tv_nsec;
fr = 1000000000;
#endif
DeltaRenderTime = double(count - oldCount) / double(fr);
auto const fixedstep{fixed_step()};
if (fixedstep > 0.0)
{
// the frame lasts exactly as long as said, however long it took to compute; the time speed doesn't apply
DeltaRenderTime = fixedstep;
}
fRenderTime += DeltaRenderTime;
if (!pause)
{
DeltaTime = (fixedstep > 0.0 ? 1.0 : Global.fTimeSpeed) * DeltaRenderTime;
fSoundTimer += DeltaTime;
if (fSoundTimer > 0.1)
fSoundTimer = 0.0;
if (DeltaTime > 1.0)
DeltaTime = 1.0;
fSimulationTime += GetDeltaTime();
}
else
DeltaTime = 0.0; // wszystko stoi, bo czas nie płynie
oldCount = count;
// Keep track of the time lapse and frame count
#if __unix__
auto fTime = (double)(count / 1000000000);
#elif _WIN32_WINNT >= _WIN32_WINNT_VISTA
double fTime = ::GetTickCount64() * 0.001f; // Get current time in seconds
#elif _WIN32
double fTime = ::GetTickCount() * 0.001f; // Get current time in seconds
#endif
++dwFrames; // licznik ramek
// update the frame rate once per second
if (fTime - fLastTime > 1.0f)
{
fFPS = dwFrames / (fTime - fLastTime);
fLastTime = fTime;
dwFrames = 0L;
}
};
}; // namespace timer
//---------------------------------------------------------------------------