From 95d99ee74b756de6d6e8333308497cc9b53146b5 Mon Sep 17 00:00:00 2001 From: RuiwenTang Date: Fri, 8 Nov 2024 15:47:45 +0800 Subject: [PATCH] gl_engine: Fix memory leak in the IndexBuffer object The CPU buffer cache in the IndexBuffer object needs to be cleared, otherwise it will cause memory leaks and reduce performance per frame --- src/renderer/gl_engine/tvgGlGpuBuffer.cpp | 11 +++++++++-- src/renderer/gl_engine/tvgGlGpuBuffer.h | 2 +- src/renderer/gl_engine/tvgGlRenderer.cpp | 7 ++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/renderer/gl_engine/tvgGlGpuBuffer.cpp b/src/renderer/gl_engine/tvgGlGpuBuffer.cpp index 9163de8b..1c06f1f3 100644 --- a/src/renderer/gl_engine/tvgGlGpuBuffer.cpp +++ b/src/renderer/gl_engine/tvgGlGpuBuffer.cpp @@ -117,9 +117,13 @@ uint32_t GlStageBuffer::pushIndex(void *data, uint32_t size) return offset; } -void GlStageBuffer::flushToGPU() +bool GlStageBuffer::flushToGPU() { - if (mStageBuffer.empty()) return; + if (mStageBuffer.empty() || mIndexBuffer.empty()) { + mStageBuffer.clear(); + mIndexBuffer.clear(); + return false; + } mGpuBuffer.bind(GlGpuBuffer::Target::ARRAY_BUFFER); @@ -131,6 +135,9 @@ void GlStageBuffer::flushToGPU() mGpuIndexBuffer.unbind(GlGpuBuffer::Target::ELEMENT_ARRAY_BUFFER); mStageBuffer.clear(); + mIndexBuffer.clear(); + + return true; } void GlStageBuffer::bind() diff --git a/src/renderer/gl_engine/tvgGlGpuBuffer.h b/src/renderer/gl_engine/tvgGlGpuBuffer.h index fca0d3f8..40a79743 100644 --- a/src/renderer/gl_engine/tvgGlGpuBuffer.h +++ b/src/renderer/gl_engine/tvgGlGpuBuffer.h @@ -56,7 +56,7 @@ public: uint32_t pushIndex(void* data, uint32_t size); - void flushToGPU(); + bool flushToGPU(); void bind(); diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 8434c60f..a9117c16 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -863,10 +863,11 @@ bool GlRenderer::sync() task->mClearBuffer = mClearBuffer; task->setTargetViewport({0, 0, static_cast(surface.w), static_cast(surface.h)}); - mGpuBuffer->flushToGPU(); - mGpuBuffer->bind(); + if (mGpuBuffer->flushToGPU()) { + mGpuBuffer->bind(); - task->run(); + task->run(); + } mGpuBuffer->unbind();