perf: 렌더링 성능 최적화 + 환적 Python 이관 + 중국어선감시 통합 #158

병합
htlee perf/rendering-optimization 에서 develop 로 9 commits 를 머지했습니다 2026-03-23 13:16:25 +09:00
Showing only changes of commit 2a2e4e3590 - Show all commits

파일 보기

@ -145,15 +145,24 @@ export function useKoreaData({
// Propagate Korea aircraft (live only — no waypoint propagation needed)
const aircraft = useMemo(() => propagateAircraft(baseAircraftKorea, currentTime), [baseAircraftKorea, currentTime]);
// Korea region ships — pre-compute mtCategory/natGroup for O(1) filter lookups
const ships = useMemo(() => {
const propagated = propagateShips(baseShipsKorea, currentTime, isLive);
for (const s of propagated) {
s.mtCategory = getMarineTrafficCategory(s.typecode, s.category);
s.natGroup = getNationalityGroup(s.flag);
}
return propagated;
}, [baseShipsKorea, currentTime, isLive]);
// Pre-compute mtCategory/natGroup on base data change (5-min polling)
// useState 값 직접 변경 불가 → 새 배열을 ref에 저장
const enrichedShipsRef = useRef<Ship[]>([]);
useMemo(() => {
enrichedShipsRef.current = baseShipsKorea.map(s => ({
...s,
mtCategory: getMarineTrafficCategory(s.typecode, s.category),
natGroup: getNationalityGroup(s.flag),
}));
}, [baseShipsKorea]);
// Korea region ships
// LIVE: enrichedShipsRef 동일 참조 반환 → 하위 useMemo 재실행 방지 (매초 currentTime 변경 무시)
// REPLAY: propagateShips로 위치 보간 → 새 배열 반환 (mtCategory는 spread로 상속)
const ships = useMemo(
() => isLive ? enrichedShipsRef.current : propagateShips(enrichedShipsRef.current, currentTime, false),
[baseShipsKorea, currentTime, isLive],
);
// Category-filtered data for map rendering (Set.has = O(1) per ship)
const visibleAircraft = useMemo(