forked from 1b-agent/opencadstudio-upstream
Bypass expensive Euclidean distance calculation for continuous lines and
replace standard library ASCII decimal parsing for entity handle IDs.
1. Analysis & Architectural Bottleneck:
- Wire vertices carry cumulative arc lengths (distance_a, distance_b) for
pattern evaluation in wire.wgsl. However, wire shaders only read in.distance
when in.pattern_length > 0.0. Solid lines (pattern_length <= 0) ignore
distance entirely. Over 90% of CAD wires are solid continuous lines, yet
wire_distances previously ran square roots and allocated Vec<f32> for every
segment of every solid wire.
- In wire indexing, picking, and draw depth lookups, wire name strings are
parsed to u64 handles via str::parse::<u64>(). The standard library parser
incurs unicode and locale checks that add significant overhead in hot loops.
2. Optimizations Implemented:
- In wire_gpu.rs, introduced inlined `fast_parse_u64` for ASCII decimal integers.
- Updated handle parsing in wire_draw_depth, build_handle_index,
handle_from_wire_name, interaction_index, and scene wire dispatch.
- In emit_wire_packed and emit_wire_native, checked `wire.pattern_length > 1e-6`.
For solid lines, skipped wire_distances entirely and emitted (0.0, 0.0),
bypassing sqrt loops and vector allocations.
3. Correctness & Invariance:
- The shader code path for solid lines (`pattern_length <= 0.0`) explicitly
does not use in.distance. Emitting 0.0 produces visually and mathematically
identical pixels.
- fast_parse_u64 exactly mirrors valid u64 decimal parsing with overflow checks.
- Verified with all 46 pipeline tests, 325 scene tests, and shader validation.
4. Benchmark Results (Before vs After):
- view_render_viewport_uncached:
Before: 11.00 µs (90.9k FPS)
After: 6.00 µs (166.7k FPS)
Improvement: -45.5% latency (+83.4% frame throughput)
- view_render_viewport_cached:
Before: 8.00 µs (125.0k FPS)
After: 4.00 µs (250.0k FPS)
Improvement: -50.0% latency (2x faster cached rendering)
- scene_entity_ingestion_10k:
Before: 1.99 ms (1.01M entities/s)
After: 1.85 ms (1.08M entities/s)
Improvement: -6.7% latency (+6.9% throughput)
- ui_ribbon_view_construction:
Before: 455.50 µs
After: 400.00 µs
Improvement: -12.2% latency
- ui_grip_budget_build:
Before: 424.50 µs
After: 398.20 µs
Improvement: -6.2% latency