Guest User

Untitled

a guest
Aug 1st, 2018
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.02 KB | None | 0 0
  1. package engine.util;
  2.  
  3. import java.util.HashMap;
  4.  
  5. public class ThreadSync {
  6.     private static HashMap<Thread,Long> variableYieldTimeMap;
  7.     private static HashMap<Thread,Long> lastTimeMap;
  8.    
  9.     static {
  10.         variableYieldTimeMap = new HashMap<Thread,Long>();
  11.         lastTimeMap = new HashMap<Thread,Long>();
  12.     }
  13.    
  14.     /**
  15.      * An accurate sync method that adapts automatically
  16.      * to the system it runs on to provide reliable results.
  17.      *
  18.      * @param fps The desired frame rate, in frames per second
  19.      */
  20.     public static void sync(int fps) {
  21.         Thread c = checkThread();
  22.         long variableYieldTime = variableYieldTimeMap.get(c);
  23.         long lastTime = lastTimeMap.get(c);
  24.        
  25.         if (fps <= 0) return;
  26.         long overSleep = 0; // time the sync goes over by
  27.         long sleepTime = 1000000000 / fps; // nanoseconds to sleep this frame
  28.  
  29.         try {
  30.             while (true) {
  31.                 sleepTime = 1000000000 / fps;
  32.                 long yieldTime = Math.min(sleepTime, variableYieldTime + sleepTime % (1000*1000));
  33.  
  34.                 long t = System.nanoTime() - lastTime;
  35.  
  36.                 if (t < sleepTime - yieldTime) {
  37.                     Thread.sleep(2);
  38.                 }
  39.                 else if (t < sleepTime) {
  40.                     // burn the last few CPU cycles to ensure accuracy
  41.                     Thread.yield();
  42.                 }
  43.                 else {
  44.                     overSleep = t - sleepTime;
  45.                     break; // exit while loop
  46.                 }
  47.             }
  48.         } catch (InterruptedException e) {}
  49.  
  50.         lastTimeMap.put(c, System.nanoTime() - Math.min(overSleep, sleepTime));
  51.  
  52.         // auto tune the time sync should yield
  53.         if (overSleep > variableYieldTime) {
  54.             // increase by 200 microseconds (1/5 a ms)
  55.             variableYieldTimeMap.put(c, Math.min(variableYieldTime + 200*1000, sleepTime));
  56.         }else if (overSleep < variableYieldTime - 200*1000) {
  57.             // decrease by 2 microseconds
  58.             variableYieldTimeMap.put(c, Math.max(variableYieldTime - 2*1000, 0));
  59.         }
  60.     }
  61.  
  62.     private static Thread checkThread() {
  63.         Thread c = Thread.currentThread();
  64.         if ( !variableYieldTimeMap.containsKey(c) )
  65.             variableYieldTimeMap.put(c, (long) 0);
  66.         if ( !lastTimeMap.containsKey(c) )
  67.             lastTimeMap.put(c, (long) 0);
  68.        
  69.         return c;
  70.     }
  71.  
  72. }
Add Comment
Please, Sign In to add comment