44 lines
1.2 KiB
JavaScript
44 lines
1.2 KiB
JavaScript
|
|
class CanvasPool {
|
|
|
|
constructor(ctx) {
|
|
this.__ctx = ctx;
|
|
this.__pool = [];
|
|
this.__pointerCounter = new WeakMap();
|
|
}
|
|
|
|
__createNewCanvas() {
|
|
console.log('create new canvas');
|
|
const canvas = (this.__ctx !== 'webgl') ? new OffscreenCanvas(1,1) : document.createElement('canvas');
|
|
canvas.acquire = this.acquireCanvas.bind(this, canvas);
|
|
canvas.release = this.releaseCanvas.bind(this, canvas);
|
|
canvas.getContext(this.__ctx);
|
|
this.__pool.push(canvas);
|
|
this.__pointerCounter.set(canvas, 0);
|
|
}
|
|
|
|
createCanvas() {
|
|
if (this.__pool.length === 0) {
|
|
this.__createNewCanvas();
|
|
}
|
|
return this.__pool.pop();
|
|
}
|
|
|
|
acquireCanvas(canvas) {
|
|
const inUse = this.__pointerCounter.get(canvas) + 1;
|
|
this.__pointerCounter.set(canvas, inUse);
|
|
}
|
|
|
|
releaseCanvas(canvas) {
|
|
const inUse = this.__pointerCounter.get(canvas) - 1;
|
|
this.__pointerCounter.set(canvas, inUse);
|
|
if (inUse === 0) {
|
|
this.__pool.push(canvas);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
export const canvasPool2D = new CanvasPool('2d');
|
|
export const canvasPoolWebGL = new CanvasPool('webgl');
|