pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
94 lines (90 loc) • 2.62 kB
JavaScript
'use strict';
var checkImageBitmap_worker = require('../../../_virtual/checkImageBitmap.worker.js');
var loadImageBitmap_worker = require('../../../_virtual/loadImageBitmap.worker.js');
"use strict";
let UUID = 0;
let MAX_WORKERS;
class WorkerManagerClass {
constructor() {
this._initialized = false;
this._createdWorkers = 0;
this._workerPool = [];
this._queue = [];
this._resolveHash = {};
}
isImageBitmapSupported() {
if (this._isImageBitmapSupported !== void 0)
return this._isImageBitmapSupported;
this._isImageBitmapSupported = new Promise((resolve) => {
const { worker } = new checkImageBitmap_worker.default();
worker.addEventListener("message", (event) => {
worker.terminate();
checkImageBitmap_worker.default.revokeObjectURL();
resolve(event.data);
});
});
return this._isImageBitmapSupported;
}
loadImageBitmap(src, asset) {
return this._run("loadImageBitmap", [src, asset?.data?.alphaMode]);
}
async _initWorkers() {
if (this._initialized)
return;
this._initialized = true;
}
_getWorker() {
if (MAX_WORKERS === void 0) {
MAX_WORKERS = navigator.hardwareConcurrency || 4;
}
let worker = this._workerPool.pop();
if (!worker && this._createdWorkers < MAX_WORKERS) {
this._createdWorkers++;
worker = new loadImageBitmap_worker.default().worker;
worker.addEventListener("message", (event) => {
this._complete(event.data);
this._returnWorker(event.target);
this._next();
});
}
return worker;
}
_returnWorker(worker) {
this._workerPool.push(worker);
}
_complete(data) {
if (data.error !== void 0) {
this._resolveHash[data.uuid].reject(data.error);
} else {
this._resolveHash[data.uuid].resolve(data.data);
}
this._resolveHash[data.uuid] = null;
}
async _run(id, args) {
await this._initWorkers();
const promise = new Promise((resolve, reject) => {
this._queue.push({ id, arguments: args, resolve, reject });
});
this._next();
return promise;
}
_next() {
if (!this._queue.length)
return;
const worker = this._getWorker();
if (!worker) {
return;
}
const toDo = this._queue.pop();
const id = toDo.id;
this._resolveHash[UUID] = { resolve: toDo.resolve, reject: toDo.reject };
worker.postMessage({
data: toDo.arguments,
uuid: UUID++,
id
});
}
}
const WorkerManager = new WorkerManagerClass();
exports.WorkerManager = WorkerManager;
//# sourceMappingURL=WorkerManager.js.map