From 4595741ab069decd82549be9c0f7ba988cdb38ab Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Mon, 4 Apr 2016 20:22:33 -0400 Subject: [PATCH] Made an attempt not to interrupt the display link queue too much when emulation is running slowly. --- OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m b/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m index 3b04dd760..3514e9001 100644 --- a/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m +++ b/OSBindings/Mac/Clock Signal/Views/CSOpenGLView.m @@ -13,6 +13,7 @@ @implementation CSOpenGLView { CVDisplayLinkRef _displayLink; uint32_t _updateIsOngoing; + int _missedFrames; } - (void)prepareOpenGL @@ -55,6 +56,7 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt const uint32_t activityMask = 0x01; if(!OSAtomicTestAndSet(activityMask, &_updateIsOngoing)) { + _missedFrames = 0; CVTimeStamp time = *now; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ [self.delegate openGLView:self didUpdateToTime:time]; @@ -64,7 +66,14 @@ static CVReturn DisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTimeSt } else { - [self drawViewOnlyIfDirty:YES]; + _missedFrames++; + if(_missedFrames == 10) + { + _missedFrames = 0; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + [self drawViewOnlyIfDirty:YES]; + }); + } } }