From 668e3d27dcb7e34d7bf82b2d973715db5577dd6b Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 23 Aug 2022 22:01:35 +0200 Subject: [PATCH] various performance improvements --- .../gui/rendering/camera/frustum/Frustum.kt | 7 ++--- .../gui/rendering/world/WorldRenderer.kt | 2 +- .../gui/rendering/world/mesh/VisibleMeshes.kt | 26 ++++++++++++------- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/camera/frustum/Frustum.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/camera/frustum/Frustum.kt index e4c0f3e4e..fc98e3e25 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/camera/frustum/Frustum.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/camera/frustum/Frustum.kt @@ -36,7 +36,7 @@ class Frustum( ) { private lateinit var data: FrustumData var revision = 0 - private set + private set fun recalculate() { val matrix = matrixHandler.viewProjectionMatrix.transpose() @@ -139,8 +139,9 @@ class Frustum( } fun containsChunk(chunkPosition: Vec2i, sectionHeight: Int, minPosition: Vec3i = CHUNK_NIN_POSITION, maxPosition: Vec3i = ProtocolDefinition.CHUNK_SECTION_SIZE): Boolean { - val min = Vec3i.of(chunkPosition, sectionHeight, minPosition) - val max = Vec3i.of(chunkPosition, sectionHeight, maxPosition + 1) + val base = Vec3i.of(chunkPosition, sectionHeight) + val min = base + minPosition + val max = base + maxPosition + 1 return containsRegion(Vec3(min), Vec3(max)) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt index f02c05ee6..3b253201e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt @@ -769,7 +769,7 @@ class WorldRenderer( this.cameraPosition = cameraPosition } - val visible = VisibleMeshes(cameraPosition) + val visible = VisibleMeshes(cameraPosition, this.visible) loadedMeshesLock.acquire() for ((chunkPosition, meshes) in this.loadedMeshes) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt index ec6f41e8b..162964282 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/VisibleMeshes.kt @@ -14,16 +14,20 @@ package de.bixilon.minosoft.gui.rendering.world.mesh import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.kutil.concurrent.pool.DefaultThreadPool +import de.bixilon.kutil.concurrent.pool.ThreadPool +import de.bixilon.kutil.concurrent.pool.ThreadPoolRunnable +import de.bixilon.kutil.latch.CountUpAndDownLatch import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.gui.rendering.world.entities.BlockEntityRenderer import de.bixilon.minosoft.util.KUtil.format -class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY) { - val opaque: MutableList = mutableListOf() - val translucent: MutableList = mutableListOf() - val transparent: MutableList = mutableListOf() - val text: MutableList = mutableListOf() - val blockEntities: MutableList> = mutableListOf() +class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY, previous: VisibleMeshes? = null) { + val opaque: ArrayList = ArrayList(previous?.opaque?.size ?: 128) + val translucent: ArrayList = ArrayList(previous?.translucent?.size ?: 16) + val transparent: ArrayList = ArrayList(previous?.transparent?.size ?: 128) + val text: ArrayList = ArrayList(previous?.text?.size ?: 16) + val blockEntities: ArrayList> = ArrayList(previous?.blockEntities?.size ?: 128) val sizeString: String get() = "${opaque.size.format()}|${translucent.size.format()}|${transparent.size.format()}|${text.size.format()}|${blockEntities.size.format()}" @@ -54,10 +58,12 @@ class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY) { fun sort() { - opaque.sortBy { it.distance } - translucent.sortBy { -it.distance } - transparent.sortBy { it.distance } - text.sortBy { it.distance } + val latch = CountUpAndDownLatch(4) + DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.Priorities.HIGHER) { opaque.sortBy { it.distance };latch.dec() } + DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.Priorities.HIGHER) { translucent.sortBy { -it.distance };latch.dec() } + DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.Priorities.HIGHER) { transparent.sortBy { it.distance };latch.dec() } + DefaultThreadPool += ThreadPoolRunnable(priority = ThreadPool.Priorities.HIGHER) { text.sortBy { it.distance };latch.dec() } + latch.await() }