bd46f6e052
Two changes that take loop fps from 9.8 to 20+ without touching the predict cost : 1. MultiHMRWorker default target_fps 10 -> 30. The Python loop was self-capping at 10 fps via sleep(period - dt) regardless of the backend. With the remote async pipeline (queue maxsize=2) the actual fresh-predict rate stays at the macm1 server ceiling (~9 fps under MLX contention), but the loop now submits frames at 30 Hz and re-emits MeshRigger-interpolated state at the same cadence -- the mesh becomes visually fluid at the loop rate even when fresh predicts are slower. Tunable via MULTIHMR_LOOP_FPS. 2. Short-circuit reused-humans : when infer() returns None (queue empty), skip dedup/tracker/One-Euro reprocessing and just sleep to the next slot. Saves ~3-5 ms CPU per idle iteration and avoids advancing the smoother on identical state. Heartbeat log extended with (fresh=Y) so we can distinguish loop rate (visualiser feed) from real predict rate. Bench remote macm1 under MLX contention : hb[coreml]: 25.0 fps (fresh=9.0). Root cause for the predict gap 53 vs 87 ms : MLX servers mlx_lm.server :8502/8503 + LoRA on macm1 burn ~30 ms of unified memory bandwidth per Multi-HMR predict. Not a software fix.