From: <ka...@us...> - 2012-03-18 16:25:29
|
Revision: 3752 http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=3752&view=rev Author: kappa1 Date: 2012-03-18 16:25:23 +0000 (Sun, 18 Mar 2012) Log Message: ----------- Fix the new accurate Display.sync() method to use less CPU on Mac. Modified Paths: -------------- trunk/LWJGL/src/java/org/lwjgl/opengl/Display.java Modified: trunk/LWJGL/src/java/org/lwjgl/opengl/Display.java =================================================================== --- trunk/LWJGL/src/java/org/lwjgl/opengl/Display.java 2012-03-04 13:41:49 UTC (rev 3751) +++ trunk/LWJGL/src/java/org/lwjgl/opengl/Display.java 2012-03-18 16:25:23 UTC (rev 3752) @@ -85,6 +85,9 @@ /** Whether the sync() method has been initiated */ private static boolean syncInitiated; + /** whether to disable adaptive yield time in sync() method */ + private static boolean adaptiveTimeDisabled; + /** adaptive time to yield instead of sleeping in sync()*/ private static long adaptiveYieldTime; @@ -419,7 +422,7 @@ long sleepTime = 1000000000 / fps; // nanoseconds to sleep this frame // adaptiveYieldTime + remainder micro & nano seconds if smaller than sleepTime - long yieldTime = Math.min(sleepTime, adaptiveYieldTime + sleepTime % (1000*1000)); + long yieldTime = adaptiveTimeDisabled ? 0 : Math.min(sleepTime, adaptiveYieldTime + sleepTime % (1000*1000)); long overSleep = 0; // time the sync goes over by try { @@ -442,15 +445,17 @@ lastTime = getTime() - Math.min(overSleep, sleepTime); - // auto tune the amount of time to yield - if (overSleep > adaptiveYieldTime) { - // increase by 200 microseconds (1/5 a ms) - adaptiveYieldTime = Math.min(adaptiveYieldTime + 200*1000, sleepTime); + if (!adaptiveTimeDisabled) { + // auto tune the amount of time to yield + if (overSleep > adaptiveYieldTime) { + // increase by 200 microseconds (1/5 a ms) + adaptiveYieldTime = Math.min(adaptiveYieldTime + 200*1000, sleepTime); + } + else if (overSleep < adaptiveYieldTime - 200*1000) { + // decrease by 5 microseconds + adaptiveYieldTime = Math.max(adaptiveYieldTime - 2*1000, 0); + } } - else if (overSleep < adaptiveYieldTime - 200*1000) { - // decrease by 5 microseconds - adaptiveYieldTime = Math.max(adaptiveYieldTime - 2*1000, 0); - } } /** @@ -462,28 +467,37 @@ } /** - * On windows the sleep functions can be highly inaccurate by - * over 10ms making in unusable. However it can be forced to - * be a bit more accurate by running a separate sleeping daemon - * thread. + * Initialise the sync(fps) method. */ private static void initiateSyncTimer() { syncInitiated = true; + lastTime = getTime(); - if (!System.getProperty("os.name").startsWith("Win")) { + String osName = System.getProperty("os.name"); + + if (osName.startsWith("Mac") || osName.startsWith("Darwin")) { + // disabled on mac as it uses too much cpu, besides + // Thread.sleep is pretty accurate on mac by default + adaptiveTimeDisabled = true; return; } - Thread timerAccuracyThread = new Thread(new Runnable() { - public void run() { - try { - Thread.sleep(Long.MAX_VALUE); - } catch (Exception e) {} - } - }); - - timerAccuracyThread.setDaemon(true); - timerAccuracyThread.start(); + if (osName.startsWith("Win")) { + // On windows the sleep functions can be highly inaccurate by + // over 10ms making in unusable. However it can be forced to + // be a bit more accurate by running a separate sleeping daemon + // thread. + Thread timerAccuracyThread = new Thread(new Runnable() { + public void run() { + try { + Thread.sleep(Long.MAX_VALUE); + } catch (Exception e) {} + } + }); + + timerAccuracyThread.setDaemon(true); + timerAccuracyThread.start(); + } } /** @return the title of the window */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |