feat(timer): improve high-FPS timing with high-resolution Windows clock
This commit is contained in:
@@ -22,8 +22,9 @@ void Timer::advanceTime()
|
|||||||
{
|
{
|
||||||
__int64 nowMs = System::currentTimeMillis();
|
__int64 nowMs = System::currentTimeMillis();
|
||||||
__int64 passedMs = nowMs - lastMs;
|
__int64 passedMs = nowMs - lastMs;
|
||||||
__int64 msSysTime = System::nanoTime() / 1000000;
|
|
||||||
double now = msSysTime / 1000.0;
|
// 4J - Use high-resolution timer for 'now' in seconds
|
||||||
|
double now = System::nanoTime() / 1000000000.0;
|
||||||
|
|
||||||
|
|
||||||
if (passedMs > 1000)
|
if (passedMs > 1000)
|
||||||
@@ -39,6 +40,7 @@ void Timer::advanceTime()
|
|||||||
accumMs += passedMs;
|
accumMs += passedMs;
|
||||||
if (accumMs > 1000)
|
if (accumMs > 1000)
|
||||||
{
|
{
|
||||||
|
__int64 msSysTime = (__int64)(now * 1000.0);
|
||||||
__int64 passedMsSysTime = msSysTime - lastMsSysTime;
|
__int64 passedMsSysTime = msSysTime - lastMsSysTime;
|
||||||
|
|
||||||
double adjustTimeT = accumMs / (double) passedMsSysTime;
|
double adjustTimeT = accumMs / (double) passedMsSysTime;
|
||||||
@@ -49,7 +51,7 @@ void Timer::advanceTime()
|
|||||||
}
|
}
|
||||||
if (accumMs < 0)
|
if (accumMs < 0)
|
||||||
{
|
{
|
||||||
lastMsSysTime = msSysTime;
|
lastMsSysTime = (__int64)(now * 1000.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lastMs = nowMs;
|
lastMs = nowMs;
|
||||||
@@ -68,7 +70,6 @@ void Timer::advanceTime()
|
|||||||
if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE;
|
if (ticks > MAX_TICKS_PER_UPDATE) ticks = MAX_TICKS_PER_UPDATE;
|
||||||
|
|
||||||
a = passedTime;
|
a = passedTime;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer::advanceTimeQuickly()
|
void Timer::advanceTimeQuickly()
|
||||||
|
|||||||
@@ -52,7 +52,22 @@ void System::arraycopy(arrayWithLength<int> src, unsigned int srcPos, arrayWithL
|
|||||||
//The current value of the system timer, in nanoseconds.
|
//The current value of the system timer, in nanoseconds.
|
||||||
__int64 System::nanoTime()
|
__int64 System::nanoTime()
|
||||||
{
|
{
|
||||||
|
#if defined _WINDOWS64 || defined _XBOX || defined _WIN32
|
||||||
|
static LARGE_INTEGER s_frequency = { 0 };
|
||||||
|
if (s_frequency.QuadPart == 0)
|
||||||
|
{
|
||||||
|
QueryPerformanceFrequency(&s_frequency);
|
||||||
|
}
|
||||||
|
|
||||||
|
LARGE_INTEGER counter;
|
||||||
|
QueryPerformanceCounter(&counter);
|
||||||
|
|
||||||
|
// Using double to avoid 64-bit overflow during multiplication for long uptime
|
||||||
|
// Precision is sufficient for ~100 days of uptime.
|
||||||
|
return (__int64)((double)counter.QuadPart * 1000000000.0 / (double)s_frequency.QuadPart);
|
||||||
|
#else
|
||||||
return GetTickCount() * 1000000LL;
|
return GetTickCount() * 1000000LL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond,
|
//Returns the current time in milliseconds. Note that while the unit of time of the return value is a millisecond,
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ This project contains the source code of Minecraft Legacy Console Edition v1.3.0
|
|||||||
- Added support for keyboard and mouse input
|
- Added support for keyboard and mouse input
|
||||||
- Added fullscreen mode support (toggle using F11)
|
- Added fullscreen mode support (toggle using F11)
|
||||||
- Disabled V-Sync for better performance
|
- Disabled V-Sync for better performance
|
||||||
|
- Added a high-resolution timer path on Windows for smoother high-FPS gameplay timing
|
||||||
- Device's screen resolution will be used as the game resolution instead of using a fixed resolution (1920x1080)
|
- Device's screen resolution will be used as the game resolution instead of using a fixed resolution (1920x1080)
|
||||||
|
|
||||||
## Controls (Keyboard & Mouse)
|
## Controls (Keyboard & Mouse)
|
||||||
|
|||||||
Reference in New Issue
Block a user