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 {
|
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
|
private var carrier: Thread? = null
|
||||||
@Volatile
|
@Volatile
|
||||||
private var isPaused = false
|
private var isPaused = false
|
||||||
@ -77,17 +79,11 @@ class ExecutionSpinner(private val waiter: Runnable, private val spinner: Boolea
|
|||||||
while (diff > 0L) {
|
while (diff > 0L) {
|
||||||
waiter.run()
|
waiter.run()
|
||||||
diff = timeUntilNextFrame()
|
diff = timeUntilNextFrame()
|
||||||
|
LockSupport.parkNanos(diff)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
compensate = -diff
|
||||||
|
|
||||||
val mark = System.nanoTime()
|
val mark = System.nanoTime()
|
||||||
val result = spinner.asBoolean
|
val result = spinner.asBoolean
|
||||||
frameRenderTime = System.nanoTime() - mark
|
frameRenderTime = System.nanoTime() - mark
|
||||||
@ -103,7 +99,6 @@ class ExecutionSpinner(private val waiter: Runnable, private val spinner: Boolea
|
|||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val PRECISE_WAIT = false
|
|
||||||
private val LOGGER = LogManager.getLogger()
|
private val LOGGER = LogManager.getLogger()
|
||||||
private var SYSTEM_SCHEDULER_RESOLUTION = 1_000_000L
|
private var SYSTEM_SCHEDULER_RESOLUTION = 1_000_000L
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user