diff --git a/templates/adsb_dashboard.html b/templates/adsb_dashboard.html index ae97b7c..27062c1 100644 --- a/templates/adsb_dashboard.html +++ b/templates/adsb_dashboard.html @@ -759,6 +759,32 @@ } } + // Throttle expensive UI operations to prevent browser freeze + let pendingUIUpdate = false; + let pendingMarkerUpdates = new Set(); + + function scheduleUIUpdate() { + if (pendingUIUpdate) return; + pendingUIUpdate = true; + requestAnimationFrame(() => { + updateStats(); + renderAircraftList(); + + // Batch marker updates + for (const icao of pendingMarkerUpdates) { + updateMarkerImmediate(icao); + } + pendingMarkerUpdates.clear(); + + // Update selected aircraft panel + if (selectedIcao && aircraft[selectedIcao]) { + showAircraftDetails(selectedIcao); + } + + pendingUIUpdate = false; + }); + } + function updateAircraft(data) { const icao = data.icao; if (!icao) return; @@ -770,22 +796,16 @@ lastSeen: Date.now() }; - // Update marker on map + // Queue marker update if (data.lat && data.lon) { - updateMarker(icao); + pendingMarkerUpdates.add(icao); } - // Update UI - updateStats(); - renderAircraftList(); - - // Update selected aircraft panel - if (selectedIcao === icao) { - showAircraftDetails(icao); - } + // Schedule batched UI update + scheduleUIUpdate(); } - function updateMarker(icao) { + function updateMarkerImmediate(icao) { const ac = aircraft[icao]; if (!ac || !ac.lat || !ac.lon) return;