Neither rate was previously measured anywhere, making it hard to tell a real acquisition bottleneck from a display/overhead one. - IDSCamera.get_live_fps() (new USER_ACCESS entry): rolling-buffer measurement of the live-mode push rate in _live_mode_loop(), readable as dev.cam_xeye.get_live_fps(). SimIDSCamera inherits it unchanged, so it works against the simulated deployment too. - XrayEyeAlign._smear_sweep() now tracks timestamps of the first and most recent distinct frame it captures, storing the computed rate as self.last_smear_fps and printing it in the sweep-done summary line. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>