Fix memory leak in particle buffers recycling

#3152
This commit is contained in:
Wojtek Figat
2025-02-17 23:25:40 +01:00
parent ccdf004404
commit 015c4ab475

View File

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