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:
@@ -573,6 +573,7 @@ static void signalHandler(int sig)
|
||||
{
|
||||
NSLog(@"Received signal %d, shutting down...", sig);
|
||||
g_running = false;
|
||||
g_bExit = S_CLIENT_EXIT; // 通知所有工作线程退出
|
||||
}
|
||||
|
||||
static void setupSignals()
|
||||
@@ -860,13 +861,25 @@ int main(int argc, const char* argv[])
|
||||
// Check permissions
|
||||
NSLog(@"Checking permissions...");
|
||||
|
||||
if (!Permissions::checkScreenCapture()) {
|
||||
bool hasScreenCapture = Permissions::checkScreenCapture();
|
||||
if (hasScreenCapture) {
|
||||
NSLog(@"Screen capture permission: OK");
|
||||
} else {
|
||||
NSLog(@"Screen capture permission not granted.");
|
||||
NSLog(@"Please grant permission in System Preferences > Privacy & Security > Screen Recording");
|
||||
Permissions::openScreenCaptureSettings();
|
||||
// Request permission (triggers system dialog on first run)
|
||||
Permissions::requestScreenCapture();
|
||||
// Only open settings if this appears to be a re-run without permission
|
||||
// Check again after request (dialog may have been shown)
|
||||
if (!Permissions::checkScreenCapture()) {
|
||||
Permissions::openScreenCaptureSettings();
|
||||
}
|
||||
}
|
||||
|
||||
if (!Permissions::checkAccessibility()) {
|
||||
bool hasAccessibility = Permissions::checkAccessibility();
|
||||
if (hasAccessibility) {
|
||||
NSLog(@"Accessibility permission: OK");
|
||||
} else {
|
||||
NSLog(@"Accessibility permission not granted.");
|
||||
NSLog(@"Please grant permission in System Preferences > Privacy & Security > Accessibility");
|
||||
Permissions::requestAccessibility();
|
||||
@@ -877,6 +890,8 @@ int main(int argc, const char* argv[])
|
||||
NSLog(@"Full Disk Access: not detected (may be false negative).");
|
||||
NSLog(@"If file access issues occur, grant FDA in System Preferences > Privacy & Security > Full Disk Access");
|
||||
// Don't auto-open settings since detection is unreliable
|
||||
} else {
|
||||
NSLog(@"Full Disk Access: OK");
|
||||
}
|
||||
|
||||
// Create client
|
||||
|
||||
Reference in New Issue
Block a user