Perf: Optimize macOS screen capture with CGDisplayStream
Core optimization: - Use CGDisplayStream instead of per-frame CGDisplayCreateImage - Push model: CPU sleeps when screen is static (condition_variable wait) - IOSurface capture avoids expensive image creation per frame - ~47% CPU reduction during active remote desktop (45% → 24%) Additional optimizations: - vImageVerticalReflect (SIMD) replaces manual row-by-row flip - Cache CGColorSpaceRef to avoid per-frame creation/release - Cache tempBuffer to avoid per-frame memory allocation - Throttle getCursorTypeIndex to 250ms (Accessibility API is expensive) Bug fixes: - Fix unreliable screen capture permission check (use actual capture test) - Improve permission logging Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -6,8 +6,27 @@
|
||||
bool Permissions::checkScreenCapture() {
|
||||
// macOS 10.15+ requires screen recording permission
|
||||
if (@available(macOS 10.15, *)) {
|
||||
// Use CGPreflightScreenCaptureAccess for reliable permission check
|
||||
// This API is available since macOS 10.15
|
||||
// CGPreflightScreenCaptureAccess() is unreliable - it can return false
|
||||
// even when permission is granted (especially after code re-signing).
|
||||
// Instead, actually try to capture the screen to verify permission.
|
||||
|
||||
CGDirectDisplayID displayID = CGMainDisplayID();
|
||||
CGImageRef image = CGDisplayCreateImage(displayID);
|
||||
|
||||
if (image != NULL) {
|
||||
// Got an image - permission is granted
|
||||
// Additional check: verify image has actual content (not blank)
|
||||
size_t width = CGImageGetWidth(image);
|
||||
size_t height = CGImageGetHeight(image);
|
||||
CGImageRelease(image);
|
||||
|
||||
if (width > 0 && height > 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Failed to capture - permission not granted or display issue
|
||||
// Fall back to preflight check for triggering dialog
|
||||
return CGPreflightScreenCaptureAccess();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user