bump kutil

This speeds up loading a lot, it uses ConcurrentIterator instead of ConcurrentSpliterator for model baking
This commit is contained in:
Moritz Zwerger 2023-12-13 19:48:31 +01:00
parent 81b1241563
commit de30a0cc48
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
5 changed files with 16 additions and 20 deletions

View File

@ -17,5 +17,5 @@ lwjgl.version=3.3.3
ikonli.version=12.3.1 ikonli.version=12.3.1
netty.version=4.1.101.Final netty.version=4.1.101.Final
jackson.version=2.16.0 jackson.version=2.16.0
kutil.version=1.24.6 kutil.version=1.25.0
glm.version=0.9.9.1-12 glm.version=0.9.9.1-12

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.data.world.chunk.manager package de.bixilon.minosoft.data.world.chunk.manager
import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kutil.collections.iterator.async.ConcurrentIterator import de.bixilon.kutil.collections.iterator.AsyncIteration.async
import de.bixilon.kutil.concurrent.pool.ThreadPool import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.minosoft.protocol.packets.s2c.play.block.chunk.ChunkUtil.isInViewDistance import de.bixilon.minosoft.protocol.packets.s2c.play.block.chunk.ChunkUtil.isInViewDistance
import java.util.* import java.util.*
@ -24,10 +24,9 @@ class ChunkTicker(val manager: ChunkManager) {
fun tick(simulationDistance: Int, cameraPosition: Vec2i) { fun tick(simulationDistance: Int, cameraPosition: Vec2i) {
val iterator = ConcurrentIterator(manager.chunks.unsafe.entries.spliterator(), priority = ThreadPool.HIGH) manager.chunks.unsafe.entries.async(priority = ThreadPool.HIGH) {
iterator.iterate {
if (!it.key.isInViewDistance(simulationDistance, cameraPosition)) { if (!it.key.isInViewDistance(simulationDistance, cameraPosition)) {
return@iterate return@async
} }
it.value.tick(manager.world.connection, it.key, random) it.value.tick(manager.world.connection, it.key, random)
} }

View File

@ -13,7 +13,7 @@
package de.bixilon.minosoft.data.world.entities package de.bixilon.minosoft.data.world.entities
import de.bixilon.kutil.collections.iterator.async.ConcurrentIterator import de.bixilon.kutil.collections.iterator.AsyncIteration.async
import de.bixilon.kutil.concurrent.pool.ThreadPool import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.minosoft.data.entities.entities.Entity import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.entities.entities.LivingEntity import de.bixilon.minosoft.data.entities.entities.LivingEntity
@ -48,10 +48,9 @@ class EntityTicker(val entities: WorldEntities) {
fun tick() { fun tick() {
val iterator = ConcurrentIterator(entities.entities.spliterator(), priority = ThreadPool.HIGH) entities.entities.async(priority = ThreadPool.HIGH) {
iterator.iterate {
if (it.attachment.vehicle != null) { if (it.attachment.vehicle != null) {
return@iterate return@async
} }
tickEntity(it) tickEntity(it)
} }

View File

@ -14,8 +14,8 @@
package de.bixilon.minosoft.gui.rendering.entities package de.bixilon.minosoft.gui.rendering.entities
import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.cast.CastUtil.nullCast
import de.bixilon.kutil.collections.iterator.async.ConcurrentIterator
import de.bixilon.kutil.collections.map.LockMap import de.bixilon.kutil.collections.map.LockMap
import de.bixilon.kutil.collections.spliterator.async.ConcurrentSpliterator
import de.bixilon.kutil.concurrent.lock.simple.SimpleLock import de.bixilon.kutil.concurrent.lock.simple.SimpleLock
import de.bixilon.kutil.concurrent.pool.ThreadPool import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.exception.ExceptionUtil.ignoreAll import de.bixilon.kutil.exception.ExceptionUtil.ignoreAll
@ -97,7 +97,7 @@ class EntityRendererManager(val renderer: EntitiesRenderer) : Iterable<EntityRen
fun iterate(executor: ((EntityRenderer<*>) -> Unit)) { fun iterate(executor: ((EntityRenderer<*>) -> Unit)) {
lock.acquire() lock.acquire()
ConcurrentIterator(renderers.unsafe.values.spliterator(), priority = ThreadPool.HIGHER).iterate(executor) ConcurrentSpliterator(renderers.unsafe.values.spliterator(), priority = ThreadPool.HIGHER).iterate(executor)
lock.release() lock.release()
} }
} }

View File

@ -14,7 +14,7 @@
package de.bixilon.minosoft.gui.rendering.models.loader package de.bixilon.minosoft.gui.rendering.models.loader
import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.cast.CastUtil.nullCast
import de.bixilon.kutil.collections.iterator.async.ConcurrentIterator import de.bixilon.kutil.collections.iterator.AsyncIteration.async
import de.bixilon.kutil.collections.map.LockMap import de.bixilon.kutil.collections.map.LockMap
import de.bixilon.kutil.concurrent.pool.ThreadPool import de.bixilon.kutil.concurrent.pool.ThreadPool
import de.bixilon.kutil.latch.AbstractLatch import de.bixilon.kutil.latch.AbstractLatch
@ -71,16 +71,15 @@ class BlockLoader(private val loader: ModelLoader) {
} }
fun load(latch: AbstractLatch?) { fun load(latch: AbstractLatch?) {
val iterator = ConcurrentIterator(loader.context.connection.registries.block.spliterator(), priority = ThreadPool.HIGH) // TODO: ConcurrentIterator loader.context.connection.registries.block.async(priority = ThreadPool.HIGH) {
iterator.iterate { if (it.model != null) return@async // model already set
if (it.model != null) return@iterate // model already set
val prototype: BlockModelPrototype val prototype: BlockModelPrototype
try { try {
prototype = loadState(it) ?: return@iterate prototype = loadState(it) ?: return@async
} catch (error: Exception) { } catch (error: Exception) {
Log.log(LogMessageType.RENDERING, LogLevels.WARN) { "Can not load block model for block $it: $error" } Log.log(LogMessageType.RENDERING, LogLevels.WARN) { "Can not load block model for block $it: $error" }
Log.log(LogMessageType.RENDERING, LogLevels.VERBOSE) { error } Log.log(LogMessageType.RENDERING, LogLevels.VERBOSE) { error }
return@iterate return@async
} }
it.model = prototype it.model = prototype
@ -89,9 +88,8 @@ class BlockLoader(private val loader: ModelLoader) {
fun bake(latch: AbstractLatch?) { fun bake(latch: AbstractLatch?) {
val context = loader.context val context = loader.context
val iterator = ConcurrentIterator(loader.context.connection.registries.block.spliterator(), priority = ThreadPool.HIGH) // TODO: ConcurrentIterator loader.context.connection.registries.block.async(priority = ThreadPool.HIGH) {
iterator.iterate { val prototype = it.model.nullCast<BlockModelPrototype>() ?: return@async
val prototype = it.model.nullCast<BlockModelPrototype>() ?: return@iterate
it.model = null it.model = null
prototype.bake(context, it) prototype.bake(context, it)