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