tags:

views:

59

answers:

1

I'm trying to keep my game at 60fps, but I'm getting strange results from my code like "2-8000 fps" Why isn't this staying at 60?

public void run(boolean fullscreen) {
        this.fullscreen = fullscreen;
        try {
            long lastFrame = 0;
            long frames = 0;

            init();
            while (!done) {
                frames++;
                long startTime = System.nanoTime() / 1000000;
                try
             {
                    System.out.println("framerate: " + ((System.nanoTime() / 1000000  - startTime) / frames ) );

                     //                 123456: 6 zeros => 16ms
                     long nsToSleep = 17000000 - (System.nanoTime() - lastFrame);
                     System.out.println("ns: " + nsToSleep);
                     lastFrame = System.nanoTime();

                     if(nsToSleep > 0)
                     {
                        System.out.println("ns2: " + (nsToSleep/1000));
                        System.out.println("ns3: " + (nsToSleep%1000));
                        Thread.sleep(nsToSleep/17000000, (int)(nsToSleep % 1000));
                     }
                     else
                     {
                        Thread.yield();  // Only necessary if you want to guarantee that
                                         // the thread yields the CPU between every frame
                     }



             }

             catch(Exception e){
                     e.printStackTrace();
             }


                mainloop();
                render();
                Display.update();
            }
            cleanup();
        }
        catch (Exception e) {
            e.printStackTrace();
            System.exit(0);
        }
    }
A: 
Thread.sleep(nsToSleep/17000000, ...);

Should be

Thread.sleep(nsToSleep/1000000, nsToSleep%1000000);

As you are converting nanoseconds to milliseconds there.

Also, as diciu pointed out in a comment on your question, you should move the calculation for the start time outside of the loop.

I haven't tested this though, so I'm not sure if that's all you'll need to fix it, but a quick glance over your code seems to show those as the problems.

Graham Edgecombe