Cesium 지도 성능 개선 — 문제 · 해결 · 수치 요약
2026. 6. 1. 11:12ㆍ개발/js,ts,node
반응형
한눈에 보기
구분Before (개선 전)After (개선 후)변화
| JS Heap 노드 수 | 52,179 | 20,674 | −60% |
| JS Heap self_size 합 | 2.45 MB | 0.35 MB | −86% |
| 스타일 condition (건물 5,000건·구간 10개) | 약 5,000 | 약 10–20 | −99% |
| POI 가시성 갱신 (60fps) | 최대 약 15회/초 | 0회/초 (이동 중), 1회/moveEnd | 줌 중 부하 제거 |
| 분석 중 타일 SSE | 16 | 28 | 패널 열림 때만 |
| 패널 닫은 뒤 타일 스타일 | 구간 색 잔존 | 1조건 reset + trim | — |
1. Heap Snapshot
문제
- Memory 스냅샷만 보면 JS 힙이 2–3 MB 수준으로 여유 있어 보임
- GPU, 3D Tiles 캐시, Worker는 스냅샷에 거의 안 잡힘
- OOM·슬로우 원인을 힙만으로 파악하기 어려움
해결
- 병목을 JS / GPU·타일 / 메인 스레드 CPU 로 구분해 측정
- 작업 관리자(Memory·GPU) + Performance + Heap을 동일 시나리오로 병행
개선된 성능 (수치)
지표BeforeAfter변화
| Heap 노드 수 | 52,179 | 20,674 | −31,505 (−60%) |
| JS self_size 합계 | 2.45 MB | 0.35 MB | −2.1 MB (−86%) |
| 스냅샷 파일 크기 | 3.9 MB | 1.7 MB | −56% |
| Detached DOM | 0 | 0 | 동일 |
2. 3D Tiles 스타일
문제
- API 응답 건물 수(수천–수만)만큼 color.conditions에 ID 일치 조건 생성
- 건물 5,000건 → 조건 약 5,000쌍 + 긴 문자열
- 타일 렌더마다 조건 평가 → 분석·색 적용 직후 CPU·메모리 스파이크
해결
- 색은 구간(높이·층수·노후도) 기준으로 타일 속성만 비교
- 구조 분류는 카테고리 수만큼만 조건 유지
- 지도 스타일에는 구간 개수만 반영, 응답 건수는 로그용
개선된 성능 (수치)
지표BeforeAfter변화
| condition 개수 (5,000건·구간 10개) | 약 5,000 | 약 10–15 | −99% |
| condition 데이터 (JS) | 응답 건수 비례 | 구간 수 비례 | 수 MB → 수 KB 급 |
| styleConditionCount / renderDataCount | 동일 수준 | 10–20 / 수천 | 분리 |
3. 분석 패널 · 그리기
문제
- 그리기·임시 데이터가 컴포넌트 밖에 남아 패널 재진입 시 핸들러·엔티티 누적
- destroy 후에도 입력 핸들러가 남는 경우
- 대용량 renderData를 React state에 두어 리렌더·복사 발생
해결
- 그리기·데이터 소스를 패널 수명에 묶고 unmount 시 해제
- 그리기 종료 시 핸들러·임시 소스까지 정리
- 분석 결과는 ref, state는 개수 등 최소만
개선된 성능 (수치)
지표BeforeAfter
| Detached DOM | 0 | 0 |
| 패널 재진입 시 handler·DataSource | 누적 가능 | unmount 시 제거 |
| React 리렌더 | 대용량 배열 state | ref 중심 |
4. POI 라벨
문제
- postRender(4프레임마다)마다 POI 전 entity 가시성 계산
- 줌·패닝 중에도 화면 좌표 변환·거리 계산 반복
- Performance trace: Cesium FunctionCall 50–130ms, 입력과 겹침
- POI OFF여도 일부 경로 동작
해결
- camera.moveEnd 에서만 로드·가시성 갱신
- 위치 40m 또는 고도 20m 이상 이동 시에만 갱신
- POI OFF 시 리스너 미등록 + 데이터 소스 제거
- 멀리 있으면 일괄 숨김, show·position 변경 시에만 갱신
개선된 성능 (수치)
지표BeforeAfter
| POI 가시성 루프 (60fps) | 최대 약 15회/초 | 0회/초 (이동 중), 1회/moveEnd |
| POI OFF 시 CPU 부담 | 일부 동작 | 거의 0 |
| 라벨 맞춤 시점 | 이동 중 매 프레임 | 카메라 정지 후 |
5. 건설계획 · 3D Tiles
문제
- 분석 패널 사용 시 LOD 타일 촘촘 로드 (SSE 16)
- 줌 시 입력·GPU·타일 부담 동시 증가 (trace 입력 합 2.3–9.8s)
- 패널 닫아도 스타일·타일 캐시 잔존
해결
- 패널 열림·분석 중 SSE 28 (이후 로드 타일 포함)
- 종료 시 SSE 복원
- 스타일 단일 기본색 reset + trimLoadedTiles + 미사용 타일 정리
개선된 성능 (수치)
지표BeforeAfter
| maximumScreenSpaceError (분석 중) | 16 | 28 |
| 패널 닫은 뒤 스타일 | 구간 white 등 | 1조건 reset |
| 타일 캐시 | 잔존 | trim |
6. Chrome DevTools (측정 환경)
문제
- Performance 녹화 시 DevTools 카테고리 약 66% (28s 중 14.6s)
- CPU 프로파일 시작 약 0.8–1.0초 단발 스파이크
- 도구를 켠 상태가 평소 체감과 다름
해결
- 앱 성능과 측정 오버헤드를 분리해 해석
- Performance 짧게 녹화, CPU 프로파일 동시 시작하지 않음
측정 수치 (trace)
지표수치
| DevTools timeline 비중 | 약 52–66% |
| CpuProfiler 시작 | 약 830–980 ms |
| GC 비중 | 약 2% |
7. React 메뉴 레이아웃
문제
- flushSync + layout effect → React 18 경고, 불필요한 동기 렌더
해결
- flushSync 제거, DOM ref 측정 후 setState 1회
개선된 성능 (수치)
지표BeforeAfter
| 콘솔 경고 | 있음 | 없음 |
8. Performance trace (개선 전 baseline)
지표Trace A (약 7초, 가벼운 줌)Trace B (약 11초, 활발한 줌)
| 메인 스레드 활성 구간 | 6.9 s | 11 s |
| DevTools 비중 | 66% | 66% |
| 입력 처리 합 / 최대 | 2.29 s / 58 ms | 9.82 s / 136 ms |
| rAF 평균 / 최대 | 1.1 ms / 12 ms | 7.2 ms / 101 ms |
| 60fps 예산(16.6ms) 초과 | 거의 없음 | 8.7% (41/469) |
| FunctionCall >30ms | 2건 | 다수 (Cesium) |
9. 요약
- Heap: 노드 −60%, JS self −86%
- 스타일: condition 약 5,000 → 약 15 (−99%)
- POI: 약 15회/초 → 0회/초 (이동 중), moveEnd당 1회
- 타일: SSE 16 → 28 (분석 중), 종료 시 reset + trim
- Trace (baseline): 입력 최대 58–136 ms, rAF 최대 12–101 ms
반응형
'개발 > js,ts,node' 카테고리의 다른 글
| api 요청 취소 (0) | 2025.07.15 |
|---|---|
| 자바스크립트로 go 배우기 (0) | 2025.06.23 |
| ts 수학 (0) | 2025.04.15 |
| 2024년도 연말정산! 외국인 기준 JS 설문 조사 (0) | 2024.12.18 |
| 2024년도 JS 최신 동향 분석 (0) | 2024.06.24 |