Skip to content

Commit

Permalink
Better handling of OSX openGL buffer-swapping in occluded windows
Browse files Browse the repository at this point in the history
  • Loading branch information
julianstorer committed Dec 29, 2015
1 parent 9ab9476 commit 88b1fe0
Showing 1 changed file with 29 additions and 28 deletions.
57 changes: 29 additions & 28 deletions modules/juce_opengl/native/juce_OpenGL_osx.h
Expand Up @@ -157,9 +157,37 @@ class OpenGLContext::NativeContext

void swapBuffers()
{
double now = Time::getMillisecondCounterHiRes();
[renderContext flushBuffer];

sleepIfRenderingTooFast();
if (minSwapTimeMs > 0)
{
// When our window is entirely occluded by other windows, flushBuffer
// fails to wait for the swap interval, so the render loop spins at full
// speed, burning CPU. This hack detects when things are going too fast
// and sleeps if necessary.

const double swapTime = Time::getMillisecondCounterHiRes() - now;
const int frameTime = (int) (now - lastSwapTime);

if (swapTime < 0.5 && frameTime < minSwapTimeMs - 3)
{
if (underrunCounter > 3)
{
Thread::sleep (2 * (minSwapTimeMs - frameTime));
now = Time::getMillisecondCounterHiRes();
}
else
++underrunCounter;
}
else
{
if (underrunCounter > 0)
--underrunCounter;
}
}

lastSwapTime = now;
}

void updateWindowPosition (const Rectangle<int>&) {}
Expand All @@ -182,33 +210,6 @@ class OpenGLContext::NativeContext
return numFrames;
}

void sleepIfRenderingTooFast()
{
// When our window is entirely occluded by other windows, the system
// fails to correctly implement the swap interval time, so the render
// loop spins at full speed, burning CPU. This hack detects when things
// are going too fast and slows things down if necessary.

if (minSwapTimeMs > 0)
{
const double now = Time::getMillisecondCounterHiRes();
const int elapsed = (int) (now - lastSwapTime);
lastSwapTime = now;

if (isPositiveAndBelow (elapsed, minSwapTimeMs - 3))
{
if (underrunCounter > 3)
Thread::sleep (minSwapTimeMs - elapsed);
else
++underrunCounter;
}
else
{
underrunCounter = 0;
}
}
}

NSOpenGLContext* renderContext;
NSOpenGLView* view;
ReferenceCountedObjectPtr<ReferenceCountedObject> viewAttachment;
Expand Down

0 comments on commit 88b1fe0

Please sign in to comment.