From db7e1312d8a9210c8c03023f030740084f5ee7d4 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 30 May 2023 02:45:47 +0200 Subject: [PATCH] some further memory improvements Mainly when moving around --- .../minosoft/gui/rendering/camera/frustum/Frustum.kt | 9 +++++---- .../minosoft/gui/rendering/stats/RenderStats.kt | 5 +++-- .../gui/rendering/world/mesh/SingleWorldMesh.kt | 8 +++++++- .../minosoft/gui/rendering/world/mesh/VisibleMeshes.kt | 10 +++++----- .../gui/rendering/world/view/WorldVisibilityGraph.kt | 10 ++++++---- 5 files changed, 26 insertions(+), 16 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 3e2116006..96b9cb689 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 @@ -155,10 +155,11 @@ class Frustum( fun containsChunkSection(chunkPosition: Vec2i, sectionHeight: Int, minPosition: Vec3i = CHUNK_NIN_POSITION, maxPosition: Vec3i = ProtocolDefinition.CHUNK_SECTION_SIZE): Boolean { val offset = camera.offset.offset - val base = Vec3i.of(chunkPosition, sectionHeight) - offset - val min = base + minPosition - val max = base + maxPosition + 1 - return containsRegion(Vec3(min), Vec3(max)) + val base = Vec3i.of(chunkPosition, sectionHeight) + base -= offset + val min = Vec3(base.x.toFloat() + minPosition.x, base.y.toFloat() + minPosition.y, base.z.toFloat() + minPosition.z) + val max = Vec3(base.x + maxPosition.x + 1.0f, base.y + maxPosition.y + 1.0f, base.z + maxPosition.z + 1.0f) + return containsRegion(min, max) } fun containsChunk(chunkPosition: Vec2i): Boolean { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/stats/RenderStats.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/stats/RenderStats.kt index ae8b0751f..7cf8a95fd 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/stats/RenderStats.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/stats/RenderStats.kt @@ -15,9 +15,10 @@ package de.bixilon.minosoft.gui.rendering.stats import de.bixilon.kutil.avg.LongAverage import de.bixilon.kutil.time.TimeUtil +import de.bixilon.kutil.time.TimeUtil.millis class RenderStats : AbstractRenderStats { - override val avgFrameTime: LongAverage = LongAverage(1L * 1000000000L) // 1 second * SECOND_SCALE + override val avgFrameTime: LongAverage = LongAverage(1L * 1000000000L, Long.MAX_VALUE) // 1 second * SECOND_SCALE override var totalFrames: Long = 0L private set @@ -27,7 +28,7 @@ class RenderStats : AbstractRenderStats { override var smoothAvgFPS: Double = 0.0 get() { - val time = TimeUtil.millis + val time = millis() if (time - lastSmoothFPSCalculationTime > 100) { field = avgFPS lastSmoothFPSCalculationTime = time diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/SingleWorldMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/SingleWorldMesh.kt index d742e0657..fb7f462aa 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/SingleWorldMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/mesh/SingleWorldMesh.kt @@ -21,7 +21,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTex import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct -class SingleWorldMesh(context: RenderContext, initialCacheSize: Int, onDemand: Boolean = false) : Mesh(context, WorldMeshStruct, initialCacheSize = initialCacheSize, onDemand = onDemand) { +class SingleWorldMesh(context: RenderContext, initialCacheSize: Int, onDemand: Boolean = false) : Mesh(context, WorldMeshStruct, initialCacheSize = initialCacheSize, onDemand = onDemand), Comparable { var distance: Float = 0.0f // Used for sorting fun addVertex(position: FloatArray, uv: Vec2, texture: AbstractTexture, tintColor: Int, light: Int) { @@ -44,6 +44,12 @@ class SingleWorldMesh(context: RenderContext, initialCacheSize: Int, onDemand: B data.add(tintLight) } + override fun compareTo(other: SingleWorldMesh): Int { + if (distance < other.distance) { + return -1 + } + return 1 + } data class WorldMeshStruct( val position: Vec3, 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 21805a5f2..81bb9dcbb 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 @@ -39,7 +39,7 @@ class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY, previous: VisibleMesh opaque += it } mesh.translucentMesh?.let { - it.distance = distance + it.distance = -distance translucent += it } mesh.transparentMesh?.let { @@ -58,10 +58,10 @@ class VisibleMeshes(val cameraPosition: Vec3 = Vec3.EMPTY, previous: VisibleMesh fun sort() { val worker = UnconditionalWorker() - worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { opaque.sortBy { it.distance } } - worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { translucent.sortBy { -it.distance } } - worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { transparent.sortBy { it.distance } } - worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { text.sortBy { it.distance } } + worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { opaque.sort() } + worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { translucent.sort() } + worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { transparent.sort() } + worker += UnconditionalTask(ThreadPool.Priorities.HIGHER) { text.sort() } worker.work() } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/view/WorldVisibilityGraph.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/view/WorldVisibilityGraph.kt index 200574b3b..b5760afc8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/view/WorldVisibilityGraph.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/view/WorldVisibilityGraph.kt @@ -250,8 +250,10 @@ class WorldVisibilityGraph( val section = chunk.sections.getOrNull(sectionIndex)?.blocks + val nextPosition = Vec2i() + if (directionX <= 0 && (section?.occlusion?.isOccluded(inverted, Directions.WEST) != true) && chunkPosition.x > chunkMin.x) { - val nextPosition = chunkPosition + Directions.WEST + nextPosition.x = chunkPosition.x - 1; nextPosition.y = chunkPosition.y // + WEST val nextChunk = chunk.neighbours[ChunkNeighbours.WEST] if (nextChunk != null) { val nextVisibilities = getVisibility(nextPosition) ?: return @@ -263,7 +265,7 @@ class WorldVisibilityGraph( } if (directionX >= 0 && (section?.occlusion?.isOccluded(inverted, Directions.EAST) != true) && chunkPosition.x < chunkMax.x) { - val nextPosition = chunkPosition + Directions.EAST + nextPosition.x = chunkPosition.x + 1; nextPosition.y = chunkPosition.y // + EAST val nextChunk = chunk.neighbours[ChunkNeighbours.EAST] if (nextChunk != null) { val nextVisibilities = getVisibility(nextPosition) ?: return @@ -288,7 +290,7 @@ class WorldVisibilityGraph( } if (directionZ <= 0 && (section?.occlusion?.isOccluded(inverted, Directions.NORTH) != true) && chunkPosition.y > chunkMin.y) { - val nextPosition = chunkPosition + Directions.NORTH + nextPosition.x = chunkPosition.x; nextPosition.y = chunkPosition.y - 1 // + NORTH val nextChunk = chunk.neighbours[ChunkNeighbours.NORTH] if (nextChunk != null) { val nextVisibilities = getVisibility(nextPosition) ?: return @@ -300,7 +302,7 @@ class WorldVisibilityGraph( } if (directionZ >= 0 && (section?.occlusion?.isOccluded(inverted, Directions.SOUTH) != true) && chunkPosition.y < chunkMax.y) { - val nextPosition = chunkPosition + Directions.SOUTH + nextPosition.x = chunkPosition.x; nextPosition.y = chunkPosition.y + 1 // + SOUTH val nextChunk = chunk.neighbours[ChunkNeighbours.SOUTH] if (nextChunk != null) { val nextVisibilities = getVisibility(nextPosition) ?: return