Switch frame loop from dispatch timer to CADisplayLink at 30fps
Replace the high-priority dispatch timer with CADisplayLink for frame updates, reducing target framerate from 60 to 30 fps. This simplifies the frame loop implementation while providing better system integration. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,7 +7,6 @@
|
||||
NSOperationQueue *_q;
|
||||
BOOL _updatingFrames;
|
||||
CADisplayLink *_displayLink;
|
||||
dispatch_source_t _timer;
|
||||
|
||||
// Shared from ScreenDumpVNC
|
||||
IOSurfaceRef _screenSurface;
|
||||
@@ -142,11 +141,6 @@
|
||||
-(void)stopFrameLoop {
|
||||
_updatingFrames = NO;
|
||||
|
||||
if (_timer) {
|
||||
dispatch_source_cancel(_timer);
|
||||
_timer = nil;
|
||||
}
|
||||
|
||||
if (_displayLink) {
|
||||
dispatch_async(dispatch_get_main_queue(), ^(void){
|
||||
[_displayLink invalidate];
|
||||
@@ -159,23 +153,11 @@
|
||||
[self stopFrameLoop];
|
||||
_updatingFrames = YES;
|
||||
|
||||
// Use high-priority dispatch timer instead of CADisplayLink
|
||||
// CADisplayLink may be throttled for daemon processes
|
||||
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(
|
||||
DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, 0);
|
||||
dispatch_queue_t timerQueue = dispatch_queue_create("com.mousen.screendump.frametimer", attr);
|
||||
|
||||
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, DISPATCH_TIMER_STRICT, timerQueue);
|
||||
|
||||
// 60 FPS = ~16.67ms interval
|
||||
uint64_t interval = NSEC_PER_SEC / 60;
|
||||
dispatch_source_set_timer(_timer, dispatch_time(DISPATCH_TIME_NOW, 0), interval, 0);
|
||||
|
||||
dispatch_source_set_event_handler(_timer, ^{
|
||||
[self _updateFrame];
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
_displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(_updateFrame)];
|
||||
_displayLink.preferredFramesPerSecond = 30;
|
||||
[_displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
|
||||
});
|
||||
|
||||
dispatch_resume(_timer);
|
||||
}
|
||||
|
||||
-(void)dealloc {
|
||||
|
||||
Reference in New Issue
Block a user