Files
il/resources/public/js/cljs-runtime/module$node_modules$pixi_DOT_js$lib$rendering$renderers$shared$GCSystem.js
2026-07-01 22:38:29 -06:00

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