Files
graphfx/src/canvas/CanvasPool.js

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');