diff --git a/src/ContainerController.ts b/src/ContainerController.ts index 99e64f3..83b10e1 100644 --- a/src/ContainerController.ts +++ b/src/ContainerController.ts @@ -31,6 +31,8 @@ export class ContainerController { surface: CanvasSurface = undefined!; inputHandlerLayer: InputHandlerLayer = undefined!; rootView: HTMLElement = undefined!; + // Canvas 要素のサイズ変更に追従するための Observer + observer: MutationObserver = undefined!; /** * ゲームコンテンツのCanvas拡大・縮小時に内部のコンテキスト領域のリサイズを行うかどうか。初期値はfalse。 @@ -124,12 +126,16 @@ export class ContainerController { // 入力受け付けレイヤー > 描画レイヤー this.surface = this.resourceFactory.createPrimarySurface(width, height); const surfaceElement = this.surface.getHTMLElement(); + // メモリリーク防止のため、過去の Canvas に対する Observer を削除しておく + if (this.observer) { + this.observer.disconnect(); + } // Canvasの親要素のwidthとheightは範囲外判定で使用するため、Canvasに追従できるようにする必要がある - const observer = new MutationObserver(() => { + this.observer = new MutationObserver(() => { this.inputHandlerLayer.view.style.width = surfaceElement.offsetWidth + "px"; this.inputHandlerLayer.view.style.height = surfaceElement.offsetHeight + "px"; }); - observer.observe(surfaceElement, { attributeFilter: ["width", "height", "style"] }); + this.observer.observe(surfaceElement, { attributeFilter: ["width", "height", "style"] }); this.inputHandlerLayer.view.appendChild(surfaceElement); // containerController -> input -> canvas this.container.appendChild(this.inputHandlerLayer.view);