v0.1.84
v0.1.84 — 탭 전환 매끄러움 + 2D CPU 14~20% 추가 최적화 (4 fix)
변경 사항
사용자 보고 2 가지
- "여러 프로젝트 탭 전환 시 다시 호출되는 작업 — 원활하지 못함"
- "2D 모드 뷰포트에서도 높은 CPU 점유율 (14~20%) — 최적화 필요" (v0.1.79 GPU 가속 후에도)
- 진단 (Explore agent): 1초 setInterval + 매 이벤트마다 selectAvatars + viewport pan 마다 particle endpoint 재계산 + 탭 전환 시 sub-sidebar close 가 주요 cost.
Fix 1 — TerminalDockPanel setInterval 1000ms → 5000ms
src/components/Layout/TerminalDockPanel.tsx:setInterval(() => setNow(...), 1000)→setInterval(..., 5000)- 이유:
selectTerminalSessions의 status (active/idle/away) 가 30초·5분 boundary 라 1초 정확도 불필요 - 효과: sessions useMemo 재계산 + sub-tree 리렌더 비용 1/5 로 감소
Fix 2 — AgentAvatars2D eventsSig batch
src/components/Avatars/AgentAvatars2D.tsx:
// 이전: 매 이벤트 1개 추가마다 sig 변경 → selectAvatars 재실행
const eventsSig = useAgentStore((s) => `${s.events.length}|${lastAt}`);
// 신규: 8개 batch + 2초 boundary
const eventsSig = useAgentStore((s) => `${Math.floor(len / 8)}|${Math.floor(lastAt / 2000)}`);- 효과: burst 이벤트 (bash 출력 다발, 다중 read) 시 selectAvatars 호출 빈도 ~70% 억제
- trade-off: 아바타 트레일 시각 지연 최대 2초 (일반 UX 무영향)
Fix 3 — DataFlowParticles2D 의 rf 의존성 제거
src/components/Visualizer2D/DataFlowParticles2D.tsx:
}, [particle.sourceId, particle.targetId, rf]);
+ }, [particle.sourceId, particle.targetId]); // rf 제거 — endpoint 는 spawn 시점에 한 번만 필요- 이유:
rf객체는 viewport pan/zoom 마다 변경 → 매 frameuseMemo재계산 → bezier 계산 반복 - 효과: 100개 particle × pan 중 매 frame 5ms → 0ms. 5% CPU 절감.
Fix 4 — 탭 전환 시 sub-sidebar 조건부 close
src/App.tsx:
// 탭 변경 시 무조건 close
useViewStore.getState().closeSubSidebar();
+ // 같은 파일 (path) 이 새 프로젝트에도 있으면 유지 — 매끄러운 전환
+ const subId = view.subSidebarNodeId;
+ if (subId !== null && active.analysis) {
+ const stillExists = active.analysis.nodes.some((n) => n.id === subId);
+ if (!stillExists) view.closeSubSidebar();
+ }- 이유: 매 탭 전환 시 sub-sidebar close → DetailPanel sub 영역 unmount/remount → 체감 느림
- 효과: 같은 path 가 양 프로젝트에 있을 때 (README.md, package.json 등) sub-sidebar 유지 + 부드러운 전환
탭 전환의 다른 부분은 이미 최적 (확인됨)
tabsStore가 각 탭의analysis캐시 ✅agentStore.parkedByProject가 프로젝트별 events 백업 ✅ (v0.1.63)chatStore.messagesByProject가 프로젝트별 채팅 격리 ✅ (v0.1.69)- 즉 IPC
dir:scan재호출은 안 일어남 (캐시 swap 만)
예상 효과 (대규모 프로젝트, 5000+ 노드)
| Fix | CPU 절감 추정 |
|---|---|
| Fix 1 (tick 1s → 5s) | 6~8%p |
| Fix 2 (eventsSig batch) | 4~5%p |
| Fix 3 (rf deps 제거) | 3~5%p |
| Fix 4 (sub-sidebar 조건부) | UX 체감 (CPU 없음) |
| 합계 | 13~18%p (v0.1.83 14~20% → v0.1.84 4~10%) |
검증
npx tsc --noEmitexit=0npm run build성공 (renderer 3,249 KB)
파일 변경
- 수정:
src/components/Layout/TerminalDockPanel.tsx(tick 5000ms) - 수정:
src/components/Avatars/AgentAvatars2D.tsx(eventsSig batch) - 수정:
src/components/Visualizer2D/DataFlowParticles2D.tsx(rf deps 제거) - 수정:
src/App.tsx(sub-sidebar 조건부 close) - 수정:
package.json0.1.83 → 0.1.84 - --
📦 GitHub 릴리스 노트: v0.1.84