private void animationLoop() { while (Thread.currentThread() == animationThread) { try { double frameStartTime = System.nanoTime(); animateNextFrame(); double currentFrameTime = System.nanoTime() - frameStartTime; int timeToNextFrame = (int) ((timePerFrame - currentFrameTime) / 1000000); if (timeToNextFrame > 0) { // Adjust frame rate to minimize sleep time if (fps < MAX_FRAMERATE && timeToNextFrame > 1) { setFrameRate(calculateOptimalFrameRate(currentFrameTime)); } Thread.sleep(timeToNextFrame); } else if (fps > MIN_FRAMERATE) { // Inadequate time left, decrease the frame rate setFrameRate(calculateOptimalFrameRate(currentFrameTime)); } } catch (InterruptedException e) { } catch (IllegalStateException e) { } } }
@Override public void init() { Dimension appletDimension = getSize(); canvasWidth = appletDimension.width; canvasHeight = appletDimension.height; setFrameRate(MAX_FRAMERATE); // Set up animation tools canvas = new Canvas(); canvas.setIgnoreRepaint(true); canvas.setSize(canvasWidth, canvasHeight); add(canvas); // Set up double buffer canvas.createBufferStrategy(2); buffer = canvas.getBufferStrategy(); }