Skip to content

Commit b61ba8a

Browse files
authored
Fix: Remove rebuild-queued chunks when they unload in muted ChunkedRenderer's (#352)
1 parent 0817c16 commit b61ba8a

1 file changed

Lines changed: 14 additions & 9 deletions

File tree

‎src/main/kotlin/com/lambda/graphics/mc/renderer/ChunkedRenderer.kt‎

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class ChunkedRenderer(
5959
private val WorldChunk.chunkData
6060
get() = chunkMap.getOrPut(chunkKey) { ChunkData(this) }
6161

62-
private val rebuildQueue = ConcurrentLinkedDeque<ChunkData>()
62+
private val rebuildSet = ConcurrentHashMap.newKeySet<ChunkData>()
6363
private val uploadQueue = ConcurrentLinkedDeque<() -> Unit>()
6464

6565
init {
@@ -78,15 +78,20 @@ class ChunkedRenderer(
7878
}
7979

8080
owner.listenUnsafe<WorldEvent.ChunkEvent.Load>(alwaysListen = true) { event -> event.chunk.chunkData.markDirty() }
81-
owner.listenUnsafe<WorldEvent.ChunkEvent.Unload>(alwaysListen = true) { chunkMap.remove(it.chunk.chunkKey)?.clearData() }
81+
owner.listenUnsafe<WorldEvent.ChunkEvent.Unload>(alwaysListen = true) { event ->
82+
chunkMap.remove(event.chunk.chunkKey)?.let { chunkData ->
83+
rebuildSet.remove(chunkData)
84+
chunkData.clearData()
85+
}
86+
}
8287
owner.listenUnsafe<WorldEvent.Leave>(alwaysListen = true) { clear() }
8388

8489
owner.listenConcurrentlyUnsafe<TickEvent.Pre> {
8590
if (pauseUpdates()) return@listenConcurrentlyUnsafe
86-
val queueSize = rebuildQueue.size
87-
val polls = minOf(Client.chunkRebuildsPerTick, queueSize)
8891
val depth = depthTest()
89-
repeat(polls) { rebuildQueue.poll()?.rebuild(depth) }
92+
rebuildSet.take(Client.chunkRebuildsPerTick).forEach { chunkData ->
93+
if (rebuildSet.remove(chunkData)) chunkData.rebuild(depth)
94+
}
9095
}
9196

9297
owner.listenUnsafe<TickEvent.Pre> {
@@ -107,21 +112,21 @@ class ChunkedRenderer(
107112
}
108113

109114
fun rebuild() {
110-
rebuildQueue.clear()
115+
rebuildSet.clear()
111116
mc.world?.chunkManager?.chunks?.let { chunks ->
112117
val chunkCount = chunks.chunks.length()
113118
(0 until chunkCount).forEach { index ->
114119
val chunk = chunks.chunks.get(index) ?: return@forEach
115120
chunkMap.putIfAbsent(chunk.chunkKey, ChunkData(chunk))
116121
}
117122
}
118-
rebuildQueue.addAll(chunkMap.values)
123+
rebuildSet.addAll(chunkMap.values)
119124
}
120125

121126
fun clear() {
122127
chunkMap.values.forEach { it.clearData() }
123128
chunkMap.clear()
124-
rebuildQueue.clear()
129+
rebuildSet.clear()
125130
uploadQueue.clear()
126131
}
127132

@@ -163,7 +168,7 @@ class ChunkedRenderer(
163168
val renderer = RegionRenderer()
164169

165170
fun markDirty() {
166-
if (!rebuildQueue.contains(this)) rebuildQueue.add(this)
171+
rebuildSet.add(this)
167172
}
168173

169174
fun rebuild(depthTest: Boolean) {

0 commit comments

Comments
 (0)