Compensate for system scheduler inaccuracy instead of spin locking

this eliminates CPU cycles burning
This commit is contained in:
DBotThePony 2024-03-28 13:07:00 +07:00
parent 9b9856ebd1
commit 7973724193
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -46,9 +46,11 @@ class ExecutionSpinner(private val waiter: Runnable, private val spinner: Boolea
}
private fun timeUntilNextFrame(): Long {
return Starbound.TIMESTEP_NANOS - (System.nanoTime() - lastRender) - frameRenderTime
return Starbound.TIMESTEP_NANOS - (System.nanoTime() - lastRender) - frameRenderTime - compensate
}
private var compensate = 0L
private var carrier: Thread? = null
@Volatile
private var isPaused = false
@ -77,17 +79,11 @@ class ExecutionSpinner(private val waiter: Runnable, private val spinner: Boolea
while (diff > 0L) {
waiter.run()
diff = timeUntilNextFrame()
if (PRECISE_WAIT) {
if (diff >= SYSTEM_SCHEDULER_RESOLUTION * 2L)
LockSupport.parkNanos(diff - SYSTEM_SCHEDULER_RESOLUTION)
else if (diff > SYSTEM_SCHEDULER_RESOLUTION)
LockSupport.parkNanos(SYSTEM_SCHEDULER_RESOLUTION)
} else {
LockSupport.parkNanos(diff)
}
LockSupport.parkNanos(diff)
}
compensate = -diff
val mark = System.nanoTime()
val result = spinner.asBoolean
frameRenderTime = System.nanoTime() - mark
@ -103,7 +99,6 @@ class ExecutionSpinner(private val waiter: Runnable, private val spinner: Boolea
}
companion object {
private const val PRECISE_WAIT = false
private val LOGGER = LogManager.getLogger()
private var SYSTEM_SCHEDULER_RESOLUTION = 1_000_000L