Make tick list even faster

This commit is contained in:
DBotThePony 2023-03-18 08:21:12 +07:00
parent 3672b9c3ac
commit 6b3e80b629
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -19,6 +19,8 @@ class TickList : ITickable {
var ticks = 0 var ticks = 0
private set private set
private var nothingToDo = true
inner class Timer(val timerTicks: Int, val runnable: Runnable) { inner class Timer(val timerTicks: Int, val runnable: Runnable) {
val ringAt = ticks + timerTicks val ringAt = ticks + timerTicks
@ -26,6 +28,8 @@ class TickList : ITickable {
private set private set
init { init {
nothingToDo = false
if (timers.isEmpty()) { if (timers.isEmpty()) {
timers.addLast(this) timers.addLast(this)
} else { } else {
@ -68,6 +72,7 @@ class TickList : ITickable {
conditionalValveTime.add(ticker) conditionalValveTime.add(ticker)
} else { } else {
conditional.addFirst(ticker) conditional.addFirst(ticker)
nothingToDo = false
} }
} }
@ -85,6 +90,7 @@ class TickList : ITickable {
onceValveTime.add(ticker) onceValveTime.add(ticker)
} else { } else {
once.addFirst(ticker) once.addFirst(ticker)
nothingToDo = false
} }
} }
@ -102,6 +108,7 @@ class TickList : ITickable {
alwaysValveTime.add(ticker) alwaysValveTime.add(ticker)
} else { } else {
always.add(ticker) always.add(ticker)
nothingToDo = false
} }
} }
@ -131,6 +138,10 @@ class TickList : ITickable {
IConditionalTickable.wrap(tickerCondition, ticker), condition, reason) IConditionalTickable.wrap(tickerCondition, ticker), condition, reason)
override fun tick() { override fun tick() {
if (nothingToDo) {
return
}
if (inTicker) { if (inTicker) {
throw ConcurrentModificationException("Already ticking") throw ConcurrentModificationException("Already ticking")
} }
@ -139,6 +150,15 @@ class TickList : ITickable {
inTicker = true inTicker = true
try { try {
var nothingToDo = true
val conditional = conditional
val once = once
val always = always
val alwaysValveTime = alwaysValveTime
val conditionalValveTime = conditionalValveTime
val onceValveTime = onceValveTime
val timers = timers
if (conditional.isNotEmpty()) { if (conditional.isNotEmpty()) {
val iterator = conditional.iterator() val iterator = conditional.iterator()
@ -147,6 +167,7 @@ class TickList : ITickable {
iterator.remove() iterator.remove()
} else { } else {
ticker.tick() ticker.tick()
nothingToDo = false
} }
} }
} }
@ -163,11 +184,14 @@ class TickList : ITickable {
for (ticker in always) { for (ticker in always) {
ticker.tick() ticker.tick()
} }
nothingToDo = false
} }
if (alwaysValveTime.isNotEmpty()) { if (alwaysValveTime.isNotEmpty()) {
always.addAll(alwaysValveTime) always.addAll(alwaysValveTime)
alwaysValveTime.clear() alwaysValveTime.clear()
nothingToDo = false
} }
if (conditionalValveTime.isNotEmpty()) { if (conditionalValveTime.isNotEmpty()) {
@ -176,6 +200,7 @@ class TickList : ITickable {
} }
conditionalValveTime.clear() conditionalValveTime.clear()
nothingToDo = false
} }
if (onceValveTime.isNotEmpty()) { if (onceValveTime.isNotEmpty()) {
@ -184,9 +209,11 @@ class TickList : ITickable {
} }
onceValveTime.clear() onceValveTime.clear()
nothingToDo = false
} }
while (timers.isNotEmpty()) { while (timers.isNotEmpty()) {
nothingToDo = false
val head = timers.first() val head = timers.first()
if (head.ringAt <= ticks) { if (head.ringAt <= ticks) {
@ -196,6 +223,8 @@ class TickList : ITickable {
break break
} }
} }
this.nothingToDo = nothingToDo
} finally { } finally {
inTicker = false inTicker = false
} }