|
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.
|