mirror of
https://github.com/unanmed/HumanBreak.git
synced 2025-09-06 16:31:46 +08:00
fix: 画布内存泄漏
This commit is contained in:
parent
351ede3996
commit
65855d1a64
@ -51,7 +51,7 @@ function constructor(
|
|||||||
- `alpha`: 是否启用透明度通道(默认为 `true`)。
|
- `alpha`: 是否启用透明度通道(默认为 `true`)。
|
||||||
- `canvas`: 可指定现有画布,未提供时自动创建新画布。
|
- `canvas`: 可指定现有画布,未提供时自动创建新画布。
|
||||||
**注意**
|
**注意**
|
||||||
- 在自定义渲染元素中,建议使用 `RenderItem.requireCanvas` 而非直接调用此构造函数。
|
- 在自定义渲染元素中,建议使用 `RenderItem.requireCanvas` 而非直接调用此构造函数。之后如果不使用,再使用 `RenderItem.deleteCanvas` 删除。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import { EventEmitter } from 'eventemitter3';
|
import { EventEmitter } from 'eventemitter3';
|
||||||
import { logger } from '@motajs/common';
|
import { logger } from '@motajs/common';
|
||||||
import { MotaOffscreenCanvas2D } from '@motajs/render-core';
|
import { MotaOffscreenCanvas2D, RenderItem } from '@motajs/render-core';
|
||||||
|
|
||||||
interface BlockCacherEvent {
|
interface BlockCacherEvent {
|
||||||
split: [];
|
split: [];
|
||||||
|
beforeClear: [index: number];
|
||||||
}
|
}
|
||||||
|
|
||||||
interface BlockData {
|
interface BlockData {
|
||||||
@ -307,9 +308,12 @@ export interface ICanvasCacheItem extends IBlockCacheable {
|
|||||||
|
|
||||||
export class CanvasCacheItem implements ICanvasCacheItem {
|
export class CanvasCacheItem implements ICanvasCacheItem {
|
||||||
constructor(
|
constructor(
|
||||||
public canvas: MotaOffscreenCanvas2D,
|
public readonly canvas: MotaOffscreenCanvas2D,
|
||||||
public symbol: number
|
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);
|
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();
|
ctx.restore();
|
||||||
// console.timeEnd('damage');
|
// console.timeEnd('damage');
|
||||||
|
@ -774,6 +774,7 @@ export class Layer extends Container<ELayerEvent> {
|
|||||||
const num = this.background;
|
const num = this.background;
|
||||||
|
|
||||||
const data = texture.getRenderable(num);
|
const data = texture.getRenderable(num);
|
||||||
|
this.backImage.forEach(v => this.deleteCanvas(v));
|
||||||
this.backImage = [];
|
this.backImage = [];
|
||||||
if (!data) return;
|
if (!data) return;
|
||||||
|
|
||||||
@ -800,6 +801,7 @@ export class Layer extends Container<ELayerEvent> {
|
|||||||
|
|
||||||
this.backImage.push(canvas);
|
this.backImage.push(canvas);
|
||||||
}
|
}
|
||||||
|
this.deleteCanvas(temp);
|
||||||
|
|
||||||
for (const ex of this.extend.values()) {
|
for (const ex of this.extend.values()) {
|
||||||
ex.onBackgroundGenerated?.(this, this.backImage);
|
ex.onBackgroundGenerated?.(this, this.backImage);
|
||||||
@ -1239,7 +1241,10 @@ export class Layer extends Container<ELayerEvent> {
|
|||||||
blockSize * cell,
|
blockSize * cell,
|
||||||
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);
|
Winskin.patternMap.set(this.imageName, winskinPattern);
|
||||||
}
|
}
|
||||||
this.patternCache = winskinPattern;
|
this.patternCache = winskinPattern;
|
||||||
|
this.deleteCanvas(pattern);
|
||||||
return winskinPattern;
|
return winskinPattern;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ export class SplittableBall extends Projectile<PalaceBoss> {
|
|||||||
private splitted: boolean = false;
|
private splitted: boolean = false;
|
||||||
|
|
||||||
static init(colors: Record<string, string[]>) {
|
static init(colors: Record<string, string[]>) {
|
||||||
|
this.ball.forEach(v => mainRenderer.deleteCanvas(v));
|
||||||
this.ball.clear();
|
this.ball.clear();
|
||||||
for (const [key, color] of Object.entries(colors)) {
|
for (const [key, color] of Object.entries(colors)) {
|
||||||
const canvas = mainRenderer.requireCanvas();
|
const canvas = mainRenderer.requireCanvas();
|
||||||
|
@ -24,7 +24,8 @@ export class MotaOffscreenCanvas2D extends EventEmitter<OffscreenCanvasEvent> {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建一个新的离屏画布\
|
* 创建一个新的离屏画布\
|
||||||
* **注意**:如果你在自定义渲染元素中使用,请避免使用此构造函数,而应该使用 `RenderItem.requireCanvas`
|
* **注意**:如果你在自定义渲染元素中使用,请避免使用此构造函数,而应该使用 `RenderItem.requireCanvas`,
|
||||||
|
* 之后如果不使用,再使用 `RenderItem.deleteCanvas` 删除。
|
||||||
* @param alpha 是否启用透明度通道
|
* @param alpha 是否启用透明度通道
|
||||||
* @param canvas 指定画布,不指定时会自动创建一个新画布
|
* @param canvas 指定画布,不指定时会自动创建一个新画布
|
||||||
*/
|
*/
|
||||||
|
@ -348,10 +348,10 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
|
|||||||
/** 这个渲染元素使用到的所有画布 */
|
/** 这个渲染元素使用到的所有画布 */
|
||||||
protected readonly canvases: Set<MotaOffscreenCanvas2D> = new Set();
|
protected readonly canvases: Set<MotaOffscreenCanvas2D> = new Set();
|
||||||
/** 这个渲染元素每个画布的配置信息 */
|
/** 这个渲染元素每个画布的配置信息 */
|
||||||
private readonly canvasMap: Map<
|
private readonly canvasMap: WeakMap<
|
||||||
MotaOffscreenCanvas2D,
|
MotaOffscreenCanvas2D,
|
||||||
RenderItemCanvasData
|
RenderItemCanvasData
|
||||||
> = new Map();
|
> = new WeakMap();
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
//#region 交互事件
|
//#region 交互事件
|
||||||
@ -1305,6 +1305,14 @@ export abstract class RenderItem<E extends ERenderItemEvent = ERenderItemEvent>
|
|||||||
this.emit('destroy');
|
this.emit('destroy');
|
||||||
this.removeAllListeners();
|
this.removeAllListeners();
|
||||||
this.canvases.clear();
|
this.canvases.clear();
|
||||||
|
this.cache.clear();
|
||||||
|
this.propagationStoped.clear();
|
||||||
|
this.cachedEvent.clear();
|
||||||
|
this.mouseId.clear();
|
||||||
|
this.touchId.clear();
|
||||||
|
this.children.clear();
|
||||||
|
this._root = void 0;
|
||||||
|
this._parent = void 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ main.floors.MT16=
|
|||||||
"no": [
|
"no": [
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": "function(){\nMota.require('replay_g').readyClip();\n}"
|
"function": "function(){\nMota.require('@user/legacy-plugin-data').readyClip();\n}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "choices",
|
"type": "choices",
|
||||||
@ -400,7 +400,7 @@ main.floors.MT16=
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": "function(){\nMota.require('chase_r').start(false);\n}"
|
"function": "function(){\nMota.require('legacy-plugin-client').start(false);\n}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "autoSave"
|
"type": "autoSave"
|
||||||
|
@ -56,7 +56,7 @@ main.floors.MT17=
|
|||||||
"12,6": [
|
"12,6": [
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": "function(){\nif (core.status.hero.hp - flags.hphphp >= 150000) {\n\tMota.require('achievement_r').completeAchievement('normal', 1);\n}\ndelete flags.hphphp;\n}"
|
"function": "function(){\nif (core.status.hero.hp - flags.hphphp >= 150000) {\n\t//Mota.require('achievement_r').completeAchievement('normal', 1);\n}\ndelete flags.hphphp;\n}"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -70,7 +70,7 @@ main.floors.MT41=
|
|||||||
"那我就送你回到标题界面吧!",
|
"那我就送你回到标题界面吧!",
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": "function(){\nMota.require('achievement_r').completeAchievement('explore', 0);\n}"
|
"function": "function(){\n//Mota.require('achievement_r').completeAchievement('explore', 0);\n}"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "restart"
|
"type": "restart"
|
||||||
|
@ -124,7 +124,7 @@ main.floors.MT6=
|
|||||||
"4,12": [
|
"4,12": [
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": "function(){\nif (core.status.hero.hp === 1) {\n\tMota.require('achievement_r').completeAchievement('normal', 0);\n}\n}"
|
"function": "function(){\nif (core.status.hero.hp === 1) {\n\t//Mota.require('achievement_r').completeAchievement('normal', 0);\n}\n}"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -123,7 +123,7 @@ main.floors.tower7=
|
|||||||
"下面,就让我们开始吧!",
|
"下面,就让我们开始吧!",
|
||||||
{
|
{
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"function": "function(){\nMota.require('replay_g').readyClip();\n}"
|
"function": "function(){\nMota.require('@user/legacy-plugin-data').readyClip();\n}"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user