perf(package): only run points loop when there's at least one point

This commit is contained in:
Luke
2023-07-14 00:57:01 +02:00
parent 6ab719654f
commit 45f155f62b

View File

@@ -6,6 +6,7 @@ let nearbyPoints: Point[] = [];
let nearbyCount: number = 0; let nearbyCount: number = 0;
let closestPoint: Point | undefined; let closestPoint: Point | undefined;
let tick: number | undefined; let tick: number | undefined;
let pointsInterval: CitizenTimer;
interface LibPoint<T = unknown> { interface LibPoint<T = unknown> {
coords: number[]; coords: number[];
@@ -37,6 +38,9 @@ export class Point<T = unknown> {
this.nearby = point.nearby; this.nearby = point.nearby;
this.args = point.args; this.args = point.args;
points.push(this); points.push(this);
if (points.length === 1) {
startPointsInterval();
}
} }
remove = () => { remove = () => {
@@ -51,71 +55,76 @@ export class Point<T = unknown> {
} }
} }
points = points.filter((point) => point.id !== this.id); points = points.filter((point) => point.id !== this.id);
if (points.length === 0) {
clearInterval(pointsInterval);
}
}; };
} }
setInterval(() => { const startPointsInterval = () => {
if (points.length < 1) return; pointsInterval = setInterval(() => {
if (points.length < 1) return;
if (nearbyCount !== 0) { if (nearbyCount !== 0) {
nearbyPoints = []; nearbyPoints = [];
nearbyCount = 0; nearbyCount = 0;
} }
const coords = Vector3.fromArray(GetEntityCoords(cache.ped, false)); const coords = Vector3.fromArray(GetEntityCoords(cache.ped, false));
if (closestPoint && coords.distance(closestPoint.coords) > closestPoint.distance) { if (closestPoint && coords.distance(closestPoint.coords) > closestPoint.distance) {
closestPoint = undefined; closestPoint = undefined;
} }
for (let i = 0; i < points.length; i++) { for (let i = 0; i < points.length; i++) {
const point = points[i]; const point = points[i];
const distance = coords.distance(point.coords); const distance = coords.distance(point.coords);
if (distance <= point.distance) { if (distance <= point.distance) {
point.currentDistance = distance; point.currentDistance = distance;
if (closestPoint && closestPoint.currentDistance) { if (closestPoint && closestPoint.currentDistance) {
if (distance < closestPoint.currentDistance) { if (distance < closestPoint.currentDistance) {
closestPoint.isClosest = false; closestPoint.isClosest = false;
point.isClosest = true;
closestPoint = point;
}
} else if (distance < point.distance) {
point.isClosest = true; point.isClosest = true;
closestPoint = point; closestPoint = point;
} }
} else if (distance < point.distance) {
point.isClosest = true;
closestPoint = point;
}
if (point.nearby) { if (point.nearby) {
nearbyCount++; nearbyCount++;
nearbyPoints[nearbyCount - 1] = point; nearbyPoints[nearbyCount - 1] = point;
}
if (point.onEnter && !point.inside) {
point.inside = true;
point.onEnter();
}
} else if (point.currentDistance) {
if (point.onExit) point.onExit();
point.inside = false;
point.currentDistance = undefined;
}
}
if (!tick) {
if (nearbyCount !== 0) {
tick = setTick(() => {
for (let i = 0; i < nearbyCount; i++) {
const point = nearbyPoints[i];
if (point && point.nearby) {
point.nearby();
}
} }
});
if (point.onEnter && !point.inside) {
point.inside = true;
point.onEnter();
}
} else if (point.currentDistance) {
if (point.onExit) point.onExit();
point.inside = false;
point.currentDistance = undefined;
}
} }
} else if (nearbyCount === 0) {
clearTick(tick); if (!tick) {
tick = undefined; if (nearbyCount !== 0) {
} tick = setTick(() => {
}, 300); for (let i = 0; i < nearbyCount; i++) {
const point = nearbyPoints[i];
if (point && point.nearby) {
point.nearby();
}
}
});
}
} else if (nearbyCount === 0) {
clearTick(tick);
tick = undefined;
}
}, 300);
};