f184ef0afb
- WGC: replace per-frame ~30 MB BGRA->RGB fancy-index allocation with cv2.cvtColor into a 3-slot pre-allocated RGB pool. Use gc.collect(0) on cleanup instead of full GC to avoid multi-hundred-ms stalls. - MSS: switch from screenshot.rgb (pure-Python BGRA->RGB rebuild) to screenshot.raw + cv2.cvtColor into a pooled buffer. Add cheap 256-byte hash-based change detection so idle frames return None — matches DXcam/BetterCam semantics. - DXcam/BetterCam: fix silent factory leak — Python name-mangling rewrote self._dxcam.__factory to _DXcamCaptureStream__factory inside the class body, so cleanup never reached the real attribute. Use getattr with string literal to bypass mangling. - calculate_dominant_color: replace np.random.choice(replace=False) (full sort) with np.random.randint, and np.unique(axis=0) (lexsort) with packed-RGB np.bincount. ~10x faster on dominant mode. - calibration._map_edge_average: switch cached scratch buffers from float64 to float32. Halves memory bandwidth on the dominant reduction path; range-safe up to 8K screens. - All engines: per-frame DEBUG logs use structlog kwarg style instead of f-strings to avoid per-frame string allocation.