@@ -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