| 
      
      
      From: <eli...@us...> - 2007-08-30 12:35:00
      
     | 
| Revision: 2895
          http://java-game-lib.svn.sourceforge.net/java-game-lib/?rev=2895&view=rev
Author:   elias_naur
Date:     2007-08-30 05:34:56 -0700 (Thu, 30 Aug 2007)
Log Message:
-----------
Don't let Display.sync* sleep with the global lock held
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	2007-08-30 12:19:34 UTC (rev 2894)
+++ trunk/LWJGL/src/java/org/lwjgl/opengl/Display.java	2007-08-30 12:34:56 UTC (rev 2895)
@@ -351,16 +351,19 @@
 	 * @param fps The desired frame rate, in frames per second
 	 */
 	public static void sync3(int fps) {
+		long savedTimeThen;
+		long timeNow;
 		synchronized (GlobalLock.lock) {
-			float frameTime = 1.0f / (fps > 1 ? fps - 1 : 1);
-			long timeNow = Sys.getTime();
-			while (timeNow > timeThen && (float) (timeNow - timeThen) / (float) Sys.getTimerResolution() < frameTime) {
-				// This is a system-friendly way of allowing other stuff to use CPU if it wants to
-				Thread.yield();
-				timeNow = Sys.getTime();
-			}
+			timeNow = Sys.getTime();
+			savedTimeThen = timeThen;
 			timeThen = timeNow;
 		}
+		float frameTime = 1.0f / (fps > 1 ? fps - 1 : 1);
+		while (timeNow > savedTimeThen && (float) (timeNow - savedTimeThen) / (float) Sys.getTimerResolution() < frameTime) {
+			// This is a system-friendly way of allowing other stuff to use CPU if it wants to
+			Thread.yield();
+			timeNow = Sys.getTime();
+		}
 	}
 
 	private static long timeLate;
@@ -371,15 +374,21 @@
 	 * @param fps The desired frame rate, in frames per second
 	 */
 	public static void sync2(int fps) {
+		long timeNow;
+		long gapTo;
+		long savedTimeLate;
 		synchronized (GlobalLock.lock) {
-			long gapTo = Sys.getTimerResolution() / fps + timeThen;
-			long timeNow = Sys.getTime();
+			gapTo = Sys.getTimerResolution() / fps + timeThen;
+			timeNow = Sys.getTime();
+			savedTimeLate = timeLate;
+		}
 
-			while (gapTo > timeNow + timeLate) {
-				Thread.yield();
-				timeNow = Sys.getTime();
-			}
+		while (gapTo > timeNow + savedTimeLate) {
+			Thread.yield();
+			timeNow = Sys.getTime();
+		}
 
+		synchronized (GlobalLock.lock) {
 			if (gapTo < timeNow)
 				timeLate = timeNow - gapTo;
 			else
@@ -395,18 +404,24 @@
 	 * @param fps The desired frame rate, in frames per second
 	 */
 	public static void sync(int fps) {
+		long timeNow;
+		long gapTo;
+		long savedTimeLate;
 		synchronized (GlobalLock.lock) {
-			long gapTo = Sys.getTimerResolution() / fps + timeThen;
-			long timeNow = Sys.getTime();
+			gapTo = Sys.getTimerResolution() / fps + timeThen;
+			timeNow = Sys.getTime();
+			savedTimeLate = timeLate;
+		}
 
-			while (gapTo > timeNow + timeLate) {
-				try {
-					Thread.sleep(1);
-				} catch (InterruptedException e) {
-				}
-				timeNow = Sys.getTime();
+		while (gapTo > timeNow + savedTimeLate) {
+			try {
+				Thread.sleep(1);
+			} catch (InterruptedException e) {
 			}
+			timeNow = Sys.getTime();
+		}
 
+		synchronized (GlobalLock.lock) {
 			if (gapTo < timeNow)
 				timeLate = timeNow - gapTo;
 			else
@@ -415,7 +430,7 @@
 			timeThen = timeNow;
 		}
 	}
-	
+
 	/**
 	 * @return the X coordinate of the window (always 0 for fullscreen)
 	 */
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
 |