150 lines
7.0 KiB
JavaScript
150 lines
7.0 KiB
JavaScript
shadow$provide.module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$GCSystem = function(global, require, module, exports) {
|
|
global = require("module$node_modules$pixi_DOT_js$lib$extensions$Extensions");
|
|
var clean = require("module$node_modules$pixi_DOT_js$lib$utils$data$clean");
|
|
"use strict";
|
|
const node_modules$pixi_DOT_js$lib$rendering$renderers$shared$GCSystem$classdecl$var18 = class {
|
|
constructor(renderer) {
|
|
this._managedResources = [];
|
|
this._managedResourceHashes = [];
|
|
this._managedCollections = [];
|
|
this._ready = !1;
|
|
this._renderer = renderer;
|
|
}
|
|
init(options) {
|
|
options = {...node_modules$pixi_DOT_js$lib$rendering$renderers$shared$GCSystem$classdecl$var18.defaultOptions, ...options};
|
|
this.maxUnusedTime = options.gcMaxUnusedTime;
|
|
this._frequency = options.gcFrequency;
|
|
this.enabled = options.gcActive;
|
|
this.now = performance.now();
|
|
}
|
|
get enabled() {
|
|
return !!this._handler;
|
|
}
|
|
set enabled(value) {
|
|
this.enabled !== value && (value ? (this._handler = this._renderer.scheduler.repeat(() => {
|
|
this._ready = !0;
|
|
}, this._frequency, !1), this._collectionsHandler = this._renderer.scheduler.repeat(() => {
|
|
for (const hash of this._managedCollections) {
|
|
const {context, collection, type} = hash;
|
|
context[collection] = "hash" === type ? clean.cleanHash(context[collection]) : clean.cleanArray(context[collection]);
|
|
}
|
|
}, this._frequency)) : (this._renderer.scheduler.cancel(this._handler), this._renderer.scheduler.cancel(this._collectionsHandler), this._collectionsHandler = this._handler = 0));
|
|
}
|
|
prerender({container}) {
|
|
this.now = performance.now();
|
|
container.renderGroup.gcTick = this._renderer.tick++;
|
|
this._updateInstructionGCTick(container.renderGroup, container.renderGroup.gcTick);
|
|
}
|
|
postrender() {
|
|
this._ready && this.enabled && (this.run(), this._ready = !1);
|
|
}
|
|
_updateInstructionGCTick(renderGroup, gcTick) {
|
|
renderGroup.instructionSet.gcTick = gcTick;
|
|
renderGroup.gcTick = gcTick;
|
|
for (const child of renderGroup.renderGroupChildren) {
|
|
this._updateInstructionGCTick(child, gcTick);
|
|
}
|
|
}
|
|
addCollection(context, collection, type) {
|
|
this._managedCollections.push({context, collection, type});
|
|
}
|
|
addResource(resource, type) {
|
|
-1 !== resource._gcLastUsed ? (resource._gcLastUsed = this.now, resource._onTouch?.(this.now)) : (resource._gcData = {index:this._managedResources.length, type}, resource._gcLastUsed = this.now, resource._onTouch?.(this.now), resource.once("unload", this.removeResource, this), this._managedResources.push(resource));
|
|
}
|
|
removeResource(resource) {
|
|
var gcData = resource._gcData;
|
|
if (gcData) {
|
|
gcData = gcData.index;
|
|
var last = this._managedResources.length - 1;
|
|
gcData !== last && (last = this._managedResources[last], this._managedResources[gcData] = last, last._gcData.index = gcData);
|
|
this._managedResources.length--;
|
|
resource._gcData = null;
|
|
resource._gcLastUsed = -1;
|
|
}
|
|
}
|
|
addResourceHash(context, hash, type, priority = 0) {
|
|
this._managedResourceHashes.push({context, hash, type, priority});
|
|
this._managedResourceHashes.sort((a, b) => a.priority - b.priority);
|
|
}
|
|
run() {
|
|
const now = performance.now();
|
|
var managedResourceHashes = this._managedResourceHashes;
|
|
for (var hashEntry of managedResourceHashes) {
|
|
this.runOnHash(hashEntry, now);
|
|
}
|
|
managedResourceHashes = 0;
|
|
for (hashEntry = 0; hashEntry < this._managedResources.length; hashEntry++) {
|
|
managedResourceHashes = this.runOnResource(this._managedResources[hashEntry], now, managedResourceHashes);
|
|
}
|
|
this._managedResources.length = managedResourceHashes;
|
|
}
|
|
updateRenderableGCTick(renderable, now) {
|
|
const renderGroup = renderable.renderGroup ?? renderable.parentRenderGroup;
|
|
(renderGroup?.gcTick ?? 0) === (renderGroup?.instructionSet?.gcTick ?? -1) && (renderable._gcLastUsed = now, renderable._onTouch?.(now));
|
|
}
|
|
runOnResource(resource, now, writeIndex) {
|
|
const gcData = resource._gcData;
|
|
"renderable" === gcData.type && this.updateRenderableGCTick(resource, now);
|
|
now - resource._gcLastUsed < this.maxUnusedTime || !resource.autoGarbageCollect ? (this._managedResources[writeIndex] = resource, gcData.index = writeIndex, writeIndex++) : (resource.unload(), resource._gcData = null, resource._gcLastUsed = -1, resource.off("unload", this.removeResource, this));
|
|
return writeIndex;
|
|
}
|
|
_createHashClone(hashValue, stopKey) {
|
|
const hashClone = Object.create(null);
|
|
for (const k in hashValue) {
|
|
if (k === stopKey) {
|
|
break;
|
|
}
|
|
null !== hashValue[k] && (hashClone[k] = hashValue[k]);
|
|
}
|
|
return hashClone;
|
|
}
|
|
runOnHash(hashEntry, now) {
|
|
const {context, hash, type} = hashEntry;
|
|
hashEntry = context[hash];
|
|
let hashClone = null, nullCount = 0;
|
|
for (const key in hashEntry) {
|
|
const resource = hashEntry[key];
|
|
if (null === resource) {
|
|
nullCount++, 1e4 !== nullCount || hashClone || (hashClone = this._createHashClone(hashEntry, key));
|
|
} else {
|
|
if (-1 === resource._gcLastUsed) {
|
|
resource._gcLastUsed = now, resource._onTouch?.(now), hashClone && (hashClone[key] = resource);
|
|
} else {
|
|
if ("renderable" === type && this.updateRenderableGCTick(resource, now), now - resource._gcLastUsed < this.maxUnusedTime || !resource.autoGarbageCollect) {
|
|
hashClone && (hashClone[key] = resource);
|
|
} else {
|
|
if ("renderable" === type) {
|
|
var res = resource;
|
|
if (res = res.renderGroup ?? res.parentRenderGroup) {
|
|
res.structureDidChange = !0;
|
|
}
|
|
}
|
|
resource.unload();
|
|
resource._gcData = null;
|
|
resource._gcLastUsed = -1;
|
|
hashClone || (1e4 !== nullCount + 1 ? (hashEntry[key] = null, nullCount++) : hashClone = this._createHashClone(hashEntry, key));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
hashClone && (context[hash] = hashClone);
|
|
}
|
|
destroy() {
|
|
this.enabled = !1;
|
|
this._managedResources.forEach(resource => {
|
|
resource.off("unload", this.removeResource, this);
|
|
});
|
|
this._managedResources.length = 0;
|
|
this._managedResourceHashes.length = 0;
|
|
this._managedCollections.length = 0;
|
|
this._renderer = null;
|
|
}
|
|
};
|
|
require = node_modules$pixi_DOT_js$lib$rendering$renderers$shared$GCSystem$classdecl$var18;
|
|
require.extension = {type:[global.ExtensionType.WebGLSystem, global.ExtensionType.WebGPUSystem, global.ExtensionType.CanvasSystem], name:"gc", priority:0};
|
|
require.defaultOptions = {gcActive:!0, gcMaxUnusedTime:6e4, gcFrequency:3e4};
|
|
exports.GCSystem = require;
|
|
};
|
|
|
|
//# sourceMappingURL=module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$GCSystem.js.map
|