Three fixes:
1. Patch 0000 now compiles standalone: replaced forward declaration
of ns_ax_face_is_selected (defined in VoiceOver patches) with
self-contained ns_zoom_face_is_selected in the Zoom patch.
2. ns_accessibility_enabled defaults to nil: eliminates ALL VoiceOver
overhead (text cache rebuild, AX notifications, Mach IPC to AX
server) when VoiceOver is not in use. Zero per-redisplay cost.
Enable with (setq ns-accessibility-enabled t).
3. UAZoomEnabled() cached for 1s + ns_zoom_track_completion rate-
limited to 2Hz: eliminates 150-600µs/frame of IPC overhead.
Root cause (per Opus analysis): UAZoomEnabled() is a synchronous
Mach IPC roundtrip to macOS Accessibility server, called 3x per
redisplay cycle. At 60fps = 180 IPC roundtrips/second blocking the
main thread. Combined with Emacs's inherent O(position) redisplay
cost, this compounded into progressive choppy behavior.
Fix 1: ns_zoom_enabled_p() caches UAZoomEnabled() for 1 second.
Fix 2: ns_zoom_track_completion() rate-limited to 2 Hz.
Also includes BUF_CHARS_MODIFF fix (patch 0009) for VoiceOver cache.
BUF_CHARS_MODIFF fix — the core performance regression:
ensureTextCache checked BUF_MODIFF which font-lock bumps on every
redisplay. Each cursor movement in a large file triggered full buffer
rebuild. Now uses BUF_CHARS_MODIFF (changes only on char insert/delete).