various performance improvements

This commit is contained in:
Bixilon 2022-08-23 22:01:35 +02:00
parent 329bdc6fb8
commit 668e3d27dc
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 21 additions and 14 deletions

View File

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

View File

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

View File

@ -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<SingleWorldMesh> = mutableListOf()
val translucent: MutableList<SingleWorldMesh> = mutableListOf()
val transparent: MutableList<SingleWorldMesh> = mutableListOf()
val text: MutableList<SingleWorldMesh> = mutableListOf()
val blockEntities: MutableList<BlockEntityRenderer<*>> = mutableListOf()
class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY, previous: VisibleMeshes? = null) {
val opaque: ArrayList<SingleWorldMesh> = ArrayList(previous?.opaque?.size ?: 128)
val translucent: ArrayList<SingleWorldMesh> = ArrayList(previous?.translucent?.size ?: 16)
val transparent: ArrayList<SingleWorldMesh> = ArrayList(previous?.transparent?.size ?: 128)
val text: ArrayList<SingleWorldMesh> = ArrayList(previous?.text?.size ?: 16)
val blockEntities: ArrayList<BlockEntityRenderer<*>> = 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()
}