From 015c4ab475a59d1d21bf3bf45b7b2895539b3fc4 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Mon, 17 Feb 2025 23:25:40 +0100 Subject: [PATCH] Fix memory leak in particle buffers recycling #3152 --- Source/Engine/Particles/Particles.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/Source/Engine/Particles/Particles.cpp b/Source/Engine/Particles/Particles.cpp index 205c87a87..f97325248 100644 --- a/Source/Engine/Particles/Particles.cpp +++ b/Source/Engine/Particles/Particles.cpp @@ -1053,7 +1053,6 @@ void UpdateGPU(RenderTask* task, GPUContext* context) ScopeLock lock(GpuUpdateListLocker); if (GpuUpdateList.IsEmpty()) return; - PROFILE_GPU("GPU Particles"); for (ParticleEffect* effect : GpuUpdateList) @@ -1093,6 +1092,7 @@ void UpdateGPU(RenderTask* task, GPUContext* context) ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter) { + PROFILE_CPU(); ParticleBuffer* result = nullptr; ASSERT(emitter && emitter->IsLoaded()); @@ -1102,7 +1102,7 @@ ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter) const auto entries = Pool.TryGet(emitter); if (entries) { - while (entries->HasItems()) + while (entries->HasItems() && !result) { // Reuse buffer result = entries->Last().Buffer; @@ -1113,11 +1113,6 @@ ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter) { Delete(result); result = nullptr; - if (entries->IsEmpty()) - { - Pool.Remove(emitter); - break; - } } } } @@ -1146,6 +1141,7 @@ ParticleBuffer* Particles::AcquireParticleBuffer(ParticleEmitter* emitter) void Particles::RecycleParticleBuffer(ParticleBuffer* buffer) { + PROFILE_CPU(); if (buffer->Emitter->EnablePooling && EnableParticleBufferPooling) { // Return to pool @@ -1166,6 +1162,7 @@ void Particles::RecycleParticleBuffer(ParticleBuffer* buffer) void Particles::OnEmitterUnload(ParticleEmitter* emitter) { + PROFILE_CPU(); PoolLocker.Lock(); const auto entries = Pool.TryGet(emitter); if (entries)