perf: LIVE 모드 매초 선박 재계산 제거 — currentTime 의존성 완전 분리
- liveShips: baseShipsKorea 변경(5분 polling) 시에만 계산. currentTime 의존성 없음. - replayShips: REPLAY 모드에서만 currentTime으로 위치 보간. - LIVE 모드: 매초 useMemo 실행 자체가 발생하지 않음. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
부모
2a2e4e3590
커밋
459a0e3d6e
@ -145,24 +145,27 @@ export function useKoreaData({
|
||||
// Propagate Korea aircraft (live only — no waypoint propagation needed)
|
||||
const aircraft = useMemo(() => propagateAircraft(baseAircraftKorea, currentTime), [baseAircraftKorea, currentTime]);
|
||||
|
||||
// Pre-compute mtCategory/natGroup on base data change (5-min polling)
|
||||
// useState 값 직접 변경 불가 → 새 배열을 ref에 저장
|
||||
const enrichedShipsRef = useRef<Ship[]>([]);
|
||||
useMemo(() => {
|
||||
enrichedShipsRef.current = baseShipsKorea.map(s => ({
|
||||
// LIVE: baseShipsKorea 변경(5분 polling) 시에만 재계산. currentTime 무관.
|
||||
// REPLAY: currentTime으로 활성 선박 + 웨이포인트 보간 필요.
|
||||
const liveShips = useMemo(() =>
|
||||
baseShipsKorea.map(s => ({
|
||||
...s,
|
||||
mtCategory: getMarineTrafficCategory(s.typecode, s.category),
|
||||
natGroup: getNationalityGroup(s.flag),
|
||||
}));
|
||||
}, [baseShipsKorea]);
|
||||
})),
|
||||
[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],
|
||||
);
|
||||
const replayShips = useMemo(() => {
|
||||
if (isLive) return liveShips; // REPLAY 아니면 계산 안 함
|
||||
const propagated = propagateShips(baseShipsKorea, currentTime, false);
|
||||
for (const s of propagated) {
|
||||
s.mtCategory = getMarineTrafficCategory(s.typecode, s.category);
|
||||
s.natGroup = getNationalityGroup(s.flag);
|
||||
}
|
||||
return propagated;
|
||||
}, [isLive, baseShipsKorea, currentTime, liveShips]);
|
||||
|
||||
const ships = isLive ? liveShips : replayShips;
|
||||
|
||||
// Category-filtered data for map rendering (Set.has = O(1) per ship)
|
||||
const visibleAircraft = useMemo(
|
||||
|
||||
불러오는 중...
Reference in New Issue
Block a user