Compensate for system scheduler inaccuracy instead of spin locking
this eliminates CPU cycles burning
This commit is contained in:
parent
9b9856ebd1
commit
7973724193
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user