получать странные результаты из кадрового кода в Java - PullRequest
0 голосов
/ 25 декабря 2009

Я пытаюсь держать свою игру на скорости 60 кадров в секунду, но я получаю странные результаты из своего кода, например "2-8000 кадров в секунду". Почему это не остается на 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);
        }
    }

1 Ответ

1 голос
/ 30 декабря 2009
Thread.sleep(nsToSleep/17000000, ...);

Должно быть

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

Когда вы там переводите наносекунды в миллисекунды.

Кроме того, как указал diciu в комментарии к вашему вопросу, вы должны переместить вычисление для времени начала за пределы цикла.

Я не проверял это, хотя и не уверен, что это все, что вам нужно, чтобы исправить это, но быстрый взгляд на ваш код, кажется, показывает, что это проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...