dsh-ros2 v0.9.1
Performance: 30 Hz request measurement + loop-budget optimizations
Measuring at rate=30 revealed the frame rate is capped by fixed per-loop overhead independent of the requested rate (10 Hz and 30 Hz both landed near 11 Hz): onUpdate ~30ms + processEvents ~30ms + render ~31ms.
Optimizations
- Throttle app.processEvents() to every 5 frames - per-frame Qt event processing triggers paint events causing a second OGRE render (~30ms/frame). events 30ms -> 0ms.
- vm.onUpdate() every 2 frames - rendering stays per-frame; TF pose refresh at 15Hz is buffered by the FrameManager transformer (no data loss). Display-update cost amortized in half.
Measured (1000x750, 0.39M-tris low-poly, 30Hz request)
| config | fps |
|---|---|
| original (events every frame) | 11.1 Hz |
| + events throttle | 14.2 Hz |
| + onUpdate/2 | 16.2 Hz |
| 800x600 + all | 17.1 Hz |
| 30Hz + motion | 15.6 Hz |
| regression: 10Hz request | 10.3 Hz (at cap) |
Conclusion: llvmpipe software rasterization (render 27-31ms/frame, scales with triangle count not resolution) is the hard floor; 30 Hz requires GPU passthrough (non-llvmpipe). Docs: architecture.md 5.2, robot-state-vision-test.md 8.4.