mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-04 10:24:02 +00:00
The CCTV layer kept every loaded camera live: each view change touched every icon, every notification rebuilt every camera's state, and the picker listed the whole catalog. With the default 4,000 cameras, a continental drag ran at 152-179 fps with 18-24 frames over 30 ms (worst 112 ms). It now runs at 235 fps with none. The layer now: - shows icons only on or near the screen, and when zoomed out keeps one camera per world-anchored cell (healthy feeds first), so panning keeps the same cameras; - grounds and draws coverage only for the cameras in view, the active camera and its coverage neighbours, retrying a camera at most twice per view regime; - reruns the view pass while the camera moves, paced by its own cost, and projects with one matrix per pass instead of a Cesium call per camera; - keeps the billboard buffer-usage hint fixed, so showing or hiding a few icons no longer rewrites the vertex data of every billboard; - lists the cameras in view (active camera first) in the picker, closing with the count of cameras outside the view, and builds the full camera list in the UI state only when it is read.
80 lines
3.8 KiB
JavaScript
80 lines
3.8 KiB
JavaScript
import { defaultSurface } from './surfaceServices.js';
|
|
import { createApplicationCctv } from '../app/layers/cctv.js';
|
|
import { createSourceSlot } from '../sources/sourceSlot.js';
|
|
import { createCctvSource } from '../layers/cctv/source.js';
|
|
|
|
const sourceSlot = createSourceSlot(
|
|
createCctvSource(),
|
|
['getCatalog', 'getHealth', 'getFrameUrl', 'getMediaUrl'],
|
|
'Cctv source',
|
|
);
|
|
export const configureCctvSource = sourceSlot.configure;
|
|
const layer = createApplicationCctv({
|
|
surface: defaultSurface,
|
|
source: sourceSlot.source,
|
|
});
|
|
export const calibrationPatchMovesAnchor = layer.calibrationPatchMovesAnchor;
|
|
export const migrateRangeScaleForFloor = layer.migrateRangeScaleForFloor;
|
|
export const _pushAmbientCardEntriesForTest =
|
|
layer._pushAmbientCardEntriesForTest;
|
|
export const _setCctvOverlayHostForTest = layer._setCctvOverlayHostForTest;
|
|
export const createCctvProjectionOverlayEntry =
|
|
layer.createCctvProjectionOverlayEntry;
|
|
export const setCctvCardPresentationOptions =
|
|
layer.setCctvCardPresentationOptions;
|
|
export const surfaceRegimeKey = layer.surfaceRegimeKey;
|
|
export const normalizeCoverageMode = layer.normalizeCoverageMode;
|
|
export const readCalibrationStoreV2 = layer.readCalibrationStoreV2;
|
|
export const writeCalibrationStoreV2 = layer.writeCalibrationStoreV2;
|
|
export const deriveCalBadge = layer.deriveCalBadge;
|
|
export const computeFrustumGeometry = layer.computeFrustumGeometry;
|
|
export const activationProbeClampRange = layer.activationProbeClampRange;
|
|
export const frameSignatureFromPixels = layer.frameSignatureFromPixels;
|
|
export const _createCctvProjectionPlaneForTest =
|
|
layer._createCctvProjectionPlaneForTest;
|
|
export const _updateCctvProjectionPlaneForTest =
|
|
layer._updateCctvProjectionPlaneForTest;
|
|
export const applyCctvFocusDeemphasis = layer.applyCctvFocusDeemphasis;
|
|
export const createGeometryProgressNotifier =
|
|
layer.createGeometryProgressNotifier;
|
|
export const processCctvGeometryQueueBatch =
|
|
layer.processCctvGeometryQueueBatch;
|
|
export const cctvGeometryDrainPacing = layer.cctvGeometryDrainPacing;
|
|
export const processCctvGeometryDrainBatch =
|
|
layer.processCctvGeometryDrainBatch;
|
|
export const prioritizeActiveCctvGeometryRecord =
|
|
layer.prioritizeActiveCctvGeometryRecord;
|
|
export const processGeometryBatch = layer.processGeometryBatch;
|
|
export const hideCctvRecordVisuals = layer.hideCctvRecordVisuals;
|
|
export const refreshCoverageStyles = layer.refreshCoverageStyles;
|
|
export const refreshHorizonCulling = layer.refreshHorizonCulling;
|
|
export const _viewRecordIdsForTest = layer._viewRecordIdsForTest;
|
|
export const clearProbeClampOnDeactivation =
|
|
layer.clearProbeClampOnDeactivation;
|
|
export const cctvRecordNeedsActivation = layer.cctvRecordNeedsActivation;
|
|
export const bindCctvWorldClickGesture = layer.bindCctvWorldClickGesture;
|
|
export const setActiveCamera = layer.setActiveCamera;
|
|
export const deactivateActiveCamera = layer.deactivateActiveCamera;
|
|
export const cctvEmptyClickDeselects = layer.cctvEmptyClickDeselects;
|
|
export const materializeCctvCoverageEntities =
|
|
layer.materializeCctvCoverageEntities;
|
|
export const materializeCctvActiveCoverageEntities =
|
|
layer.materializeCctvActiveCoverageEntities;
|
|
export const materializeCctvVisibleCoverageEntities =
|
|
layer.materializeCctvVisibleCoverageEntities;
|
|
export const _extractPickedCameraIdForTest =
|
|
layer._extractPickedCameraIdForTest;
|
|
export const _setCctvCoverageStateForTest = layer._setCctvCoverageStateForTest;
|
|
export const focusCctvRecord = layer.focusCctvRecord;
|
|
export const maybeAutoHop = layer.maybeAutoHop;
|
|
export const cctvCycleIndex = layer.cctvCycleIndex;
|
|
export {
|
|
CCTV_CALIBRATION_STORAGE_KEY_V1,
|
|
CCTV_CALIBRATION_STORAGE_KEY_V2,
|
|
FRUSTUM_GROUND_CLEARANCE_M,
|
|
CCTV_FOCUS_RESULT,
|
|
CCTV_PROJECTION_OVERLAY_SOURCE_ID,
|
|
CCTV_PROJECTION_OVERLAY_SOURCE_OPTIONS,
|
|
} from '../layers/cctv/index.js';
|
|
export default layer;
|