- package client.glBase;
- import javax.media.opengl.GLCanvas;
- /**
- * Eigener FPSAnimator, der in einem Thread läuft und sleep benutzt. Sollte also
- * nicht mehr 100% CPU-Last erzeugen, wenn die ZielFPS erreicht werden. :-D
- */
- public final class FPSAnimator extends Thread {
- /** Flag, ob der Thread abgebrochen wurde. */
- private boolean aborted;
- /** GLCanvas, der aktualisiert werden soll. */
- private GLCanvas glCanvas;
- /** Millisekunden, die ein Frame mit der ZielFPS brauchen wird. */
- private long fpsTime;
- /**
- * Konstruktor.
- *
- * @param glCanvas
- * Der GLCanvas.
- * @param targetFPS
- * Die ZielFPS.
- */
- public FPSAnimator(GLCanvas glCanvas, int targetFPS) {
- this.glCanvas = glCanvas;
- this.fpsTime = 1000 / targetFPS;
- }
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Thread#run()
- */
- @Override
- public void run() {
- long oldTime;
- long curTime;
- this.aborted = false;
- // Läuft solange, bis abgebrochen wird.
- while (!this.aborted) {
- oldTime = System.currentTimeMillis();
- this.glCanvas.display();
- curTime = System.currentTimeMillis();
- // Ggf. noch die verbleibende Zeit abwarten, wenn das
- // Framerendern schneller war, als die verfügbare Zeit
- // für ein Frame.
- if (curTime - oldTime < this.fpsTime) {
- try {
- Thread.sleep(this.fpsTime - (curTime - oldTime));
- } catch (InterruptedException e) {
- this.aborted = true;
- }
- }
- }
- }
- /**
- * Thread-Abbruch.
- */
- public void abort() {
- this.aborted = true;
- }
- }