[ts][webgl][player] Dispose ManagedWebGLRenderingContext.

This commit is contained in:
Davide Tantillo 2025-07-16 15:46:51 +02:00
parent 0b42677299
commit 351b2c6164
2 changed files with 24 additions and 10 deletions

View File

@ -280,11 +280,16 @@ export class SpinePlayer implements Disposable {
this.sceneRenderer?.dispose(); this.sceneRenderer?.dispose();
this.loadingScreen?.dispose(); this.loadingScreen?.dispose();
this.assetManager?.dispose(); this.assetManager?.dispose();
this.context?.dispose();
for (var i = 0; i < this.eventListeners.length; i++) { for (var i = 0; i < this.eventListeners.length; i++) {
var eventListener = this.eventListeners[i]; var eventListener = this.eventListeners[i];
eventListener.target.removeEventListener(eventListener.event, eventListener.func); eventListener.target.removeEventListener(eventListener.event, eventListener.func);
} }
this.input?.dispose(); this.input?.dispose();
if (this.canvas) {
this.canvas.width = 0;
this.canvas.height = 0;
}
this.parent.removeChild(this.dom); this.parent.removeChild(this.dom);
this.disposed = true; this.disposed = true;
} }

View File

@ -27,9 +27,9 @@
* THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * 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 canvas: HTMLCanvasElement | OffscreenCanvas;
public gl: WebGLRenderingContext; public gl: WebGLRenderingContext;
private restorables = new Array<Restorable>(); private restorables = new Array<Restorable>();
@ -39,20 +39,28 @@ export class ManagedWebGLRenderingContext {
let canvas: HTMLCanvasElement = canvasOrContext; let canvas: HTMLCanvasElement = canvasOrContext;
this.gl = <WebGLRenderingContext>(canvas.getContext("webgl2", contextConfig) || canvas.getContext("webgl", contextConfig)); this.gl = <WebGLRenderingContext>(canvas.getContext("webgl2", contextConfig) || canvas.getContext("webgl", contextConfig));
this.canvas = canvas; this.canvas = canvas;
canvas.addEventListener("webglcontextlost", (e: any) => { canvas.addEventListener("webglcontextlost", this.contextLostHandler);
let event = <WebGLContextEvent>e; canvas.addEventListener("webglcontextrestored", this.contextRestoredHandler);
if (e) e.preventDefault();
});
canvas.addEventListener("webglcontextrestored", (e: any) => {
for (let i = 0, n = this.restorables.length; i < n; i++)
this.restorables[i].restore();
});
} else { } else {
this.gl = canvasOrContext; this.gl = canvasOrContext;
this.canvas = this.gl.canvas; 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) { addRestorable (restorable: Restorable) {
this.restorables.push(restorable); this.restorables.push(restorable);
} }
@ -61,4 +69,5 @@ export class ManagedWebGLRenderingContext {
let index = this.restorables.indexOf(restorable); let index = this.restorables.indexOf(restorable);
if (index > -1) this.restorables.splice(index, 1); if (index > -1) this.restorables.splice(index, 1);
} }
} }