Commit graph

9 commits

Author SHA1 Message Date
Hibryda
c61262c604 perf(ui-gpui): eliminate ProjectBox Entity, plain struct + direct render (2.17%)
ProjectBoxData replaces Entity<ProjectBox>. Workspace is the only view
entity in the dispatch tree. Timer notifies Workspace via cx.spawn.
12 optimization iterations: 90% → 2.17% CPU for a pulsing dot.
2026-03-20 00:40:35 +01:00
Hibryda
6f0f276400 perf(ui-gpui): flatten hierarchy + SharedBlink (Arc<AtomicBool>)
- Eliminated ProjectGrid entity level: Workspace renders ProjectBoxes directly
  (3 dispatch tree levels: Workspace → ProjectBox → inline divs)
- Replaced Entity<BlinkState> + Entity<StatusDotView> with SharedBlink
  (Arc<AtomicBool> toggled by background timer, read atomically in render)
- Timer calls cx.notify() directly on ProjectBox (no intermediate entities)
- CPU: 2.93% (unchanged from 3.07% — confirms cost is ProjectBox::render()
  overhead, not hierarchy depth or entity count)
- Each blink frame: ~15ms total (render + layout + prepaint + paint + GPU submit)
- Zed comparison: ~5ms per blink frame (EditorElement is custom Element, not div tree)
2026-03-19 23:45:05 +01:00
Hibryda
5d69f6b28f perf(ui-gpui): focus-gated blink + comprehensive rendering analysis
Focus-gated blink: only first (focused) project blinks.
Root cause: 14 header divs × 2 boxes × 2/sec = 2.8% CPU.
Cached children (AgentPane, TerminalView) confirmed at 0%.
Path to <1%: custom Element for ProjectBox (major refactor).
2026-03-19 23:26:20 +01:00
Hibryda
3859317477 perf(ui-gpui): add render counters, remove redundant cx.observe, reduce repaints
- BlinkState.start_from_context<V>() uses Context<V> spawn (not App)
  which correctly registers the async task in the window's executor
- ProjectGrid NOT cached (blocks child dirty propagation)
- AgentPane + TerminalView cached with into_cached_flex()
- Render diagnostic: ProjectBox renders 2x/sec (blink), both boxes
  re-render because shared parent, but inner cached views are free
- CPU: ~3% with pulsing dot visible
2026-03-19 22:48:29 +01:00
Hibryda
1f26e5b272 perf(ui-gpui): diagnostic counters confirm 2 renders/sec at window level (GPUI limit)
- Sidebar and StatusBar uncached (natural size collapsed with StyleRefinement::default)
- ProjectGrid cached with flex-1 style (into_cached_flex)
- AgentPane + TerminalView cached within ProjectBox
- BlinkState::start() fixed with &mut *cx deref coercion
- CPU: ~3% with full layout visible (down from 6.8% uncached)
- Remaining: ProjectBox re-renders full tree on blink (reads BlinkState)
- Next: isolate dot into StatusDotView entity to prevent ProjectBox re-render
2026-03-19 22:45:21 +01:00
Hibryda
73cfdf6752 perf(ui-gpui): cache SharedStrings, remove diagnostics, zero alloc per render frame
- BlinkState as shared Entity (not child) → cx.notify() only dirties ProjectBox,
  NOT ancestors (Workspace, ProjectGrid). Siblings serve from GPU cache.
- .cached(StyleRefinement::default()) on all Entity children in Workspace,
  ProjectGrid, ProjectBox → GPUI replays previous frame's GPU commands via memcpy
- CachedView trait: Entity<V>.into_cached_view() → AnyView::from().cached()
- Result: 4.5% CPU → 0.83% CPU (25 ticks / 30s) for pulsing dot animation
2026-03-19 22:35:41 +01:00
Hibryda
5dbf5bd43c perf(ui-gpui): cache SharedStrings, remove diagnostics, zero alloc per render frame 2026-03-19 09:38:00 +01:00
Hibryda
7ab5d97352 perf(ui-gpui): add render counters, remove redundant cx.observe, reduce repaints 2026-03-19 09:27:08 +01:00
Hibryda
f3d2ca78ba feat: add Dioxus and GPUI UI prototypes for framework comparison
Dioxus (ui-dioxus/): 2,169 lines, WebView mode (same wry as Tauri),
  Catppuccin theme, 12 components, agor-core integration, compiles clean.
  Evolution path — keeps xterm.js, gradual migration from Tauri.

GPUI (ui-gpui/): 2,490 lines, GPU-accelerated rendering, alacritty_terminal
  for native terminal, 17 files, Catppuccin palette, demo data.
  Revolution path — pure Rust UI, 120fps target, no WebView.

Both are standalone (not in workspace), share agor-core backend.
Created for side-by-side comparison to inform framework decision.
2026-03-19 06:05:58 +01:00