fix(satellites): use timestamp-based trail filtering to prevent flash

- Changed trail data structure to {pos, time} with Date.now() timestamp
- Replaced length-based filtering with time-based filtering (5 second window)
- Trail now naturally clears when page returns to foreground
- No more ugly frame-skipping or visibilitychange workarounds

Build: passes
This commit is contained in:
rayd1o
2026-03-23 03:56:45 +08:00
parent 0c950262d3
commit 465129eec7

View File

@@ -18,6 +18,7 @@ let lockedRingSprite = null;
const SATELLITE_API = SATELLITE_CONFIG.apiPath + '?limit=' + SATELLITE_CONFIG.maxCount; const SATELLITE_API = SATELLITE_CONFIG.apiPath + '?limit=' + SATELLITE_CONFIG.maxCount;
const MAX_SATELLITES = SATELLITE_CONFIG.maxCount; const MAX_SATELLITES = SATELLITE_CONFIG.maxCount;
const TRAIL_LENGTH = SATELLITE_CONFIG.trailLength; const TRAIL_LENGTH = SATELLITE_CONFIG.trailLength;
const TRAIL_MAX_AGE_MS = 5000; // 5 seconds
const DOT_TEXTURE_SIZE = 32; const DOT_TEXTURE_SIZE = 32;
function createCircularDotTexture() { function createCircularDotTexture() {
@@ -244,10 +245,10 @@ export function updateSatellitePositions(deltaTime = 0) {
satellitePositions[i].current.copy(pos); satellitePositions[i].current.copy(pos);
satellitePositions[i].trail.push(pos.clone()); satellitePositions[i].trail.push({ pos: pos.clone(), time: Date.now() });
if (satellitePositions[i].trail.length > TRAIL_LENGTH) { satellitePositions[i].trail = satellitePositions[i].trail.filter(
satellitePositions[i].trail.shift(); p => Date.now() - p.time < TRAIL_MAX_AGE_MS
} );
positions[i * 3] = pos.x; positions[i * 3] = pos.x;
positions[i * 3 + 1] = pos.y; positions[i * 3 + 1] = pos.y;
@@ -281,7 +282,7 @@ export function updateSatellitePositions(deltaTime = 0) {
const trailIdx = (i * TRAIL_LENGTH + j) * 3; const trailIdx = (i * TRAIL_LENGTH + j) * 3;
if (j < trail.length) { if (j < trail.length) {
const t = trail[j]; const t = trail[j].pos;
trailPositions[trailIdx] = t.x; trailPositions[trailIdx] = t.x;
trailPositions[trailIdx + 1] = t.y; trailPositions[trailIdx + 1] = t.y;
trailPositions[trailIdx + 2] = t.z; trailPositions[trailIdx + 2] = t.z;