public void run() {
        
        prevFps = 0;
        fps = 0;
        prevTime = System.nanoTime(); // grab current time in nano second
        this.preStart().start().postStart();

        while (this.sceneOnPlay()) {
            
            currTime = System.nanoTime();
            length = currTime - prevTime;
            prevTime = currTime;
            delta = length / ((double)optimalTime);
            prevFps += length;
            fps++;
            if (prevFps >= 1000000000) {
                newSecond = true;
                grabFps = fps;
                System.out.println("(fps: "+fps+")");
                prevFps = 0;
                fps = 0;
            } else {
                newSecond = false;
            }
            // ImageManager + AudioManager update
            DataManager.update();
            this.update();
            ImageManager.update();
            
            try {
                if ((prevTime-System.nanoTime() + optimalTime)/1000000 > 0)
                    Thread.sleep( (prevTime-System.nanoTime() + optimalTime)/1000000 );
            } catch (InterruptedException exp) {
                System.out.println(exp);
            };
        }
        this.preEnd().end().postEnd();
    }