fix: 画布内存泄漏

This commit is contained in:
AncTe committed 2025-09-05 13:10:38 +08:00
1 parent 351ede3996
commit 65855d1a64
13 files changed
+50 -30

No files matched your search

@@ -1,9 +1,10 @@
import { EventEmitter } from 'eventemitter3';
import { logger } from '@motajs/common';
import { MotaOffscreenCanvas2D } from '@motajs/render-core';
import { MotaOffscreenCanvas2D, RenderItem } from '@motajs/render-core';
interface BlockCacherEvent {
split: [];
beforeClear: [index: number];
}
interface BlockData {
@@ -307,9 +308,12 @@ export interface ICanvasCacheItem extends IBlockCacheable {
export class CanvasCacheItem implements ICanvasCacheItem {
constructor(
public canvas: MotaOffscreenCanvas2D,
public symbol: number
public readonly canvas: MotaOffscreenCanvas2D,
public readonly symbol: number,
public readonly element: RenderItem
) {}
destroy(): void {}
destroy(): void {
this.element.deleteCanvas(this.canvas);
}
}
@@ -539,7 +539,7 @@ export class Damage extends RenderItem<EDamageEvent> {
});
ctx.drawImage(temp.canvas, px, py, size, size);
block.cache.set(v, new CanvasCacheItem(temp, temp.symbol));
block.cache.set(v, new CanvasCacheItem(temp, temp.symbol, this));
});
ctx.restore();
// console.timeEnd('damage');
@@ -774,6 +774,7 @@ export class Layer extends Container<ELayerEvent> {
const num = this.background;
const data = texture.getRenderable(num);
this.backImage.forEach(v => this.deleteCanvas(v));
this.backImage = [];
if (!data) return;
@@ -800,6 +801,7 @@ export class Layer extends Container<ELayerEvent> {
this.backImage.push(canvas);
}
this.deleteCanvas(temp);
for (const ex of this.extend.values()) {
ex.onBackgroundGenerated?.(this, this.backImage);
@@ -1239,7 +1241,10 @@ export class Layer extends Container<ELayerEvent> {
blockSize * cell,
blockSize * cell
);
this.block.cache.set(index, new CanvasCacheItem(temp, temp.symbol));
this.block.cache.set(
index,
new CanvasCacheItem(temp, temp.symbol, this)
);
});
}
@@ -211,6 +211,7 @@ export class Winskin extends RenderItem<EWinskinEvent> {
Winskin.patternMap.set(this.imageName, winskinPattern);
}
this.patternCache = winskinPattern;
this.deleteCanvas(pattern);
return winskinPattern;
}