From aa7f5ca36ee8f2753238755f3698917dace39fcb Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 16 Sep 2021 18:21:19 +0200 Subject: [PATCH] fix crash/freeze in particle renderer --- .../gui/rendering/particle/ParticleRenderer.kt | 5 +++-- .../minosoft/util/collections/ArrayFloatList.kt | 15 +++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt index 89dd4fa4c..673f5ce5b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/particle/ParticleRenderer.kt @@ -84,8 +84,6 @@ class ParticleRenderer( override fun update() { particleMesh.unload() transparentParticleMesh.unload() - particleMesh = ParticleMesh(renderWindow, particles.size) - transparentParticleMesh = ParticleMesh(renderWindow, 500) val toRemove: MutableSet = mutableSetOf() @@ -95,6 +93,9 @@ class ParticleRenderer( particleQueue.clear() } + particleMesh = ParticleMesh(renderWindow, particles.size) + transparentParticleMesh = ParticleMesh(renderWindow, 500) + for (particle in particles) { particle.tryTick() if (particle.dead) { diff --git a/src/main/java/de/bixilon/minosoft/util/collections/ArrayFloatList.kt b/src/main/java/de/bixilon/minosoft/util/collections/ArrayFloatList.kt index df5d8453e..86f64d35f 100644 --- a/src/main/java/de/bixilon/minosoft/util/collections/ArrayFloatList.kt +++ b/src/main/java/de/bixilon/minosoft/util/collections/ArrayFloatList.kt @@ -14,7 +14,7 @@ package de.bixilon.minosoft.util.collections class ArrayFloatList( - private val initialSize: Int = 1000, + private val initialSize: Int = DEFAULT_INITIAL_SIZE, ) { private var data: FloatArray = FloatArray(initialSize) val limit: Int @@ -24,6 +24,12 @@ class ArrayFloatList( val isEmpty: Boolean get() = size == 0 + private val nextGrowStep = when { + initialSize <= 0 -> DEFAULT_INITIAL_SIZE + initialSize <= 50 -> 50 + else -> initialSize + } + private var output: FloatArray = FloatArray(0) private var outputUpToDate = false @@ -39,7 +45,7 @@ class ArrayFloatList( } var newSize = data.size while (newSize - size < needed) { - newSize += initialSize + newSize += nextGrowStep } val oldData = data data = FloatArray(newSize) @@ -78,4 +84,9 @@ class ArrayFloatList( checkOutputArray() return output } + + + private companion object { + private const val DEFAULT_INITIAL_SIZE = 1000 + } }