diff --git a/spine-ts/spine-player/src/Player.ts b/spine-ts/spine-player/src/Player.ts index c2c8c2b8e..36478f67f 100644 --- a/spine-ts/spine-player/src/Player.ts +++ b/spine-ts/spine-player/src/Player.ts @@ -280,11 +280,16 @@ export class SpinePlayer implements Disposable { this.sceneRenderer?.dispose(); this.loadingScreen?.dispose(); this.assetManager?.dispose(); + this.context?.dispose(); for (var i = 0; i < this.eventListeners.length; i++) { var eventListener = this.eventListeners[i]; eventListener.target.removeEventListener(eventListener.event, eventListener.func); } this.input?.dispose(); + if (this.canvas) { + this.canvas.width = 0; + this.canvas.height = 0; + } this.parent.removeChild(this.dom); this.disposed = true; } diff --git a/spine-ts/spine-webgl/src/WebGL.ts b/spine-ts/spine-webgl/src/WebGL.ts index 2103c61e6..4e783284a 100644 --- a/spine-ts/spine-webgl/src/WebGL.ts +++ b/spine-ts/spine-webgl/src/WebGL.ts @@ -27,9 +27,9 @@ * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ -import { Restorable } from "@esotericsoftware/spine-core"; +import { Disposable, type Restorable } from "@esotericsoftware/spine-core"; -export class ManagedWebGLRenderingContext { +export class ManagedWebGLRenderingContext implements Disposable { public canvas: HTMLCanvasElement | OffscreenCanvas; public gl: WebGLRenderingContext; private restorables = new Array(); @@ -39,20 +39,28 @@ export class ManagedWebGLRenderingContext { let canvas: HTMLCanvasElement = canvasOrContext; this.gl = (canvas.getContext("webgl2", contextConfig) || canvas.getContext("webgl", contextConfig)); this.canvas = canvas; - canvas.addEventListener("webglcontextlost", (e: any) => { - let event = e; - if (e) e.preventDefault(); - }); - canvas.addEventListener("webglcontextrestored", (e: any) => { - for (let i = 0, n = this.restorables.length; i < n; i++) - this.restorables[i].restore(); - }); + canvas.addEventListener("webglcontextlost", this.contextLostHandler); + canvas.addEventListener("webglcontextrestored", this.contextRestoredHandler); } else { this.gl = canvasOrContext; this.canvas = this.gl.canvas; } } + private contextLostHandler(e: Event) { + if (e) e.preventDefault(); + } + + private contextRestoredHandler(e: Event) { + for (let i = 0, n = this.restorables.length; i < n; i++) + this.restorables[i].restore(); + } + + dispose(): void { + this.canvas.removeEventListener("webglcontextlost", this.contextLostHandler); + this.canvas.removeEventListener("webglcontextrestored", this.contextRestoredHandler); + } + addRestorable (restorable: Restorable) { this.restorables.push(restorable); } @@ -61,4 +69,5 @@ export class ManagedWebGLRenderingContext { let index = this.restorables.indexOf(restorable); if (index > -1) this.restorables.splice(index, 1); } + }