New Timer, need testing

This commit is contained in:
GabsPuNs
2026-05-12 21:49:46 -04:00
parent 582cf2219c
commit dbb0460c69
2 changed files with 33 additions and 104 deletions

View File

@@ -20,120 +20,54 @@ Timer::Timer(float ticksPerSecond)
void Timer::advanceTime()
{
int64_t nowMs = System::currentTimeMillis();
int64_t passedMs = nowMs - lastMs;
int64_t nowNano = System::nanoTime();
double nowSeconds = nowNano / 1000000000.0;
static double lastFrameTime = nowSeconds;
double elapsedSeconds = nowSeconds - lastFrameTime;
lastFrameTime = nowSeconds;
// 4J - Use high-resolution timer for 'now' in seconds
double now = System::nanoTime() / 1000000000.0;
if (elapsedSeconds < 0) elapsedSeconds = 0;
if (elapsedSeconds > 1.0) elapsedSeconds = 1.0;
if (passedMs > 1000)
{
lastTime = now;
}
else if (passedMs < 0)
{
lastTime = now;
}
else
{
accumMs += passedMs;
if (accumMs > 1000)
{
const int64_t msSysTime = static_cast<int64_t>(now * 1000.0);
const int64_t passedMsSysTime = msSysTime - lastMsSysTime;
const double adjustTimeT = accumMs / static_cast<double>(passedMsSysTime);
adjustTime += (adjustTimeT - adjustTime) * 0.2f;
lastMsSysTime = msSysTime;
accumMs = 0;
}
if (accumMs < 0)
{
lastMsSysTime = static_cast<int64_t>(now * 1000.0);
}
}
lastMs = nowMs;
double passedSeconds = (now - lastTime) * adjustTime;
lastTime = now;
if (passedSeconds < 0) passedSeconds = 0;
if (passedSeconds > 1) passedSeconds = 1;
passedTime = static_cast<float>(passedTime + (passedSeconds * timeScale * ticksPerSecond));
double frameDelta = elapsedSeconds * timeScale * ticksPerSecond;
passedTime += static_cast<float>(frameDelta);
ticks = static_cast<int>(passedTime);
passedTime -= ticks;
if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE;
if (ticks > MAX_TICKS_PER_UPDATE)
ticks = MAX_TICKS_PER_UPDATE;
a = passedTime;
}
void Timer::advanceTimeQuickly()
{
passedTime += static_cast<float>(MAX_TICKS_PER_UPDATE) * timeScale;
double passedSeconds = static_cast<double>(MAX_TICKS_PER_UPDATE) / static_cast<double>(ticksPerSecond);
passedTime = static_cast<float>(passedTime + (passedSeconds * timeScale * ticksPerSecond));
ticks = static_cast<int>(passedTime);
passedTime -= ticks;
a = passedTime;
a = 0.0f;
lastMs = System::currentTimeMillis();
lastMsSysTime = System::nanoTime() / 1000000;
}
void Timer::skipTime()
{
int64_t nowMs = System::currentTimeMillis();
int64_t passedMs = nowMs - lastMs;
int64_t msSysTime = System::nanoTime() / 1000000;
double now = msSysTime / 1000.0;
int64_t nowNano = System::nanoTime();
double nowSeconds = nowNano / 1000000000.0;
lastMs = System::currentTimeMillis();
lastMsSysTime = nowNano / 1000000;
lastTime = nowSeconds;
if (passedMs > 1000)
{
lastTime = now;
}
else if (passedMs < 0)
{
lastTime = now;
}
else
{
accumMs += passedMs;
if (accumMs > 1000)
{
int64_t passedMsSysTime = msSysTime - lastMsSysTime;
double adjustTimeT = accumMs / static_cast<double>(passedMsSysTime);
adjustTime += (adjustTimeT - adjustTime) * 0.2f;
lastMsSysTime = msSysTime;
accumMs = 0;
}
if (accumMs < 0)
{
lastMsSysTime = msSysTime;
}
}
lastMs = nowMs;
double passedSeconds = (now - lastTime) * adjustTime;
lastTime = now;
if (passedSeconds < 0) passedSeconds = 0;
if (passedSeconds > 1) passedSeconds = 1;
passedTime = static_cast<float>(passedTime + (passedSeconds * timeScale * ticksPerSecond));
ticks = static_cast<int>(0);
if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE;
passedTime -= ticks;
ticks = 0;
passedTime = 0.0f;
a = 0.0f;
}