From 00ab71e73b92e38221f85cd2efc6843c3c50dd0a Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Fri, 3 Nov 2023 15:44:07 +0100 Subject: [PATCH] Mesh: unload data if not loaded yet That should fix some memory leaks (especially in entity rendering) --- .../minosoft/gui/rendering/chunk/mesher/ChunkMesher.kt | 10 +++++++--- .../rendering/entities/feature/hitbox/HitboxFeature.kt | 1 - .../entities/feature/text/BillboardTextFeature.kt | 1 - .../bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt | 7 +++++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/ChunkMesher.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/ChunkMesher.kt index 023a71684..53b861d7e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/ChunkMesher.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/mesher/ChunkMesher.kt @@ -39,10 +39,14 @@ class ChunkMesher( } val sectionNeighbours = ChunkUtil.getDirectNeighbours(neighbours, item.chunk, item.section.sectionHeight) val mesh = ChunkMeshes(renderer.context, item.chunkPosition, item.sectionHeight, item.section.smallMesh) - solid.mesh(item.chunkPosition, item.sectionHeight, item.chunk, item.section, neighbours, sectionNeighbours, mesh) + try { + solid.mesh(item.chunkPosition, item.sectionHeight, item.chunk, item.section, neighbours, sectionNeighbours, mesh) - if (item.section.blocks.fluidCount > 0) { - fluid.mesh(item.chunkPosition, item.sectionHeight, item.chunk, item.section, neighbours, sectionNeighbours, mesh) + if (item.section.blocks.fluidCount > 0) { + fluid.mesh(item.chunkPosition, item.sectionHeight, item.chunk, item.section, neighbours, sectionNeighbours, mesh) + } + } finally { + mesh.unload() } return mesh diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt index 14de71d49..6f1510f46 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/hitbox/HitboxFeature.kt @@ -135,7 +135,6 @@ class HitboxFeature(renderer: EntityRenderer<*>) : EntityRenderFeature(renderer) override fun unload() { val mesh = this.mesh ?: return this.mesh = null - if (mesh.state != Mesh.MeshStates.LOADED) return renderer.renderer.queue += { mesh.unload() } } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt index add8b6db2..bbc9bc3cc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/feature/text/BillboardTextFeature.kt @@ -76,7 +76,6 @@ open class BillboardTextFeature( val mesh = this.mesh ?: return this.mesh = null this.info = null - if (mesh.state != Mesh.MeshStates.LOADED) return renderer.renderer.queue += { mesh.unload() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt index 6a9d90505..cd62e6f16 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt @@ -83,8 +83,11 @@ abstract class Mesh( } fun unload() { - check(state == MeshStates.LOADED) { "Can not unload $state mesh!" } - buffer.unload() + when (state) { + MeshStates.LOADED -> buffer.unload() + MeshStates.PREPARING, MeshStates.FINISHED -> _data?.unload() + else -> throw IllegalStateException("Mesh is already unloaded") + } state = MeshStates.UNLOADED }