From b4c5043caf13e83e4c9d184655b3416c3268e671 Mon Sep 17 00:00:00 2001 From: GuoLei1990 Date: Wed, 30 Oct 2024 17:40:29 +0800 Subject: [PATCH] fix: shader destroy memory residual --- packages/core/src/Engine.ts | 2 +- packages/core/src/shader/ShaderPass.ts | 5 ++++- packages/core/src/shader/ShaderProgramPool.ts | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Engine.ts b/packages/core/src/Engine.ts index 2ef364100..c1d98d91e 100644 --- a/packages/core/src/Engine.ts +++ b/packages/core/src/Engine.ts @@ -491,7 +491,7 @@ export class Engine extends EventDispatcher { if (length > shaderProgramPools.length) { shaderProgramPools.length = length; } - shaderProgramPools[index] = pool = new ShaderProgramPool(); + shaderProgramPools[index] = pool = new ShaderProgramPool(this); shaderPass._shaderProgramPools.push(pool); } return pool; diff --git a/packages/core/src/shader/ShaderPass.ts b/packages/core/src/shader/ShaderPass.ts index 934b8030a..811b75556 100644 --- a/packages/core/src/shader/ShaderPass.ts +++ b/packages/core/src/shader/ShaderPass.ts @@ -146,8 +146,11 @@ export class ShaderPass extends ShaderPart { _destroy(): void { const shaderProgramPools = this._shaderProgramPools; for (let i = 0, n = shaderProgramPools.length; i < n; i++) { - shaderProgramPools[i]._destroy(); + const shaderProgramPool = shaderProgramPools[i]; + shaderProgramPool._destroy(); + delete shaderProgramPool.engine._shaderProgramPools[this._shaderPassId]; } + // Clear array storing multiple engine shader program pools shaderProgramPools.length = 0; } diff --git a/packages/core/src/shader/ShaderProgramPool.ts b/packages/core/src/shader/ShaderProgramPool.ts index 9b9dc9380..3b43a07af 100644 --- a/packages/core/src/shader/ShaderProgramPool.ts +++ b/packages/core/src/shader/ShaderProgramPool.ts @@ -1,3 +1,4 @@ +import { Engine } from "../Engine"; import { ShaderMacroCollection } from "./ShaderMacroCollection"; import { ShaderProgram } from "./ShaderProgram"; @@ -11,6 +12,8 @@ export class ShaderProgramPool { private _lastQueryMap: Record; private _lastQueryKey: number; + constructor(public engine: Engine) {} + /** * Get shader program by macro collection. * @param macros - macro collection