code: @Override
      public void start(Screen screen, Frame frame)
      {
          Check.notNull(screen);
          Check.notNull(frame);
  
          final boolean sync = hasSync(screen);
          if (maxFrameTimeNano < 0)
          {
              notifyRateChanged(screen.getConfig().getOutput().getRate());
          }
          long currentTimeNano = System.nanoTime();
          double acc = 0.0;
          isRunning = true;
  
          while (isRunning)
          {
              if (screen.isReady())
              {
                  final long firstTimeNano = System.nanoTime();
                  final long frameTimeNano = UtilMath.clamp(firstTimeNano - currentTimeNano, 0L, MAX_FRAME_TIME_NANO);
                  currentTimeNano = firstTimeNano;
                  acc += frameTimeNano;
  
                  do
                  {
                      frame.update(Constant.EXTRP);
                      acc -= maxFrameTimeNano;
                  }
                  while (acc > maxFrameTimeNano);
  
                  screen.preUpdate();
                  frame.render();
                  screen.update();
  
                  while (sync && System.nanoTime() - firstTimeNano < maxFrameTimeNano)
                  {
                      Thread.yield();
                  }
  
                  frame.computeFrameRate(firstTimeNano, Math.max(firstTimeNano + 1L, System.nanoTime()));
              }
              else
              {
                  frame.check();
                  UtilSequence.pause(Constant.DECADE);
              }
          }
      }
docs: /*
  Loop