LWJGL Display.update() замедляющее приложение

Я использую LWJGL для Java-приложения, и у меня, похоже, проблема с Display.update(), Если я удалю Display.update() из цикла я получаю FPS около 7000000 - 9000000. С Display.update() Я получаю только около 200 - 300 FPS. Это нормально?

Я использую Macbook Air 2013 с 1,7 ГГц i7, 8 ГБ оперативной памяти и Intel HD Graphics 5000.

Вот код, который у меня есть:

Main.java

class Main{
    private static Time time;
    public static void main(String[] args) {
        initDisplay();
        initGL();
        time = new Time();
        gameLoop();
        cleanUp();
    }

    private static void gameLoop(){
        while (!Display.isCloseRequested()) {
            Display.update();
            time.updateFPS();
        }
    }

    private static void initDisplay(){
        try{
            Display.setDisplayMode(new DisplayMode(800, 600));
            Display.setVSyncEnabled(false);
            Display.create();
            Display.setTitle("Application Title");
        }catch(LWJGLException e){
            System.exit(1);
        }
    }

    private static void initGL(){
        glEnable(GL_TEXTURE_2D);
        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 1, -1);
        glMatrixMode(GL_MODELVIEW);
        glDisable(GL_DEPTH_TEST);
        glClearColor(0, 0, 0, 0);
    }

    private static void cleanUp(){
        Display.destroy();
    }
}

Time.java

public class Time {
    long lastFrame;
    long lastFPS;
    int fps;

    public Time(){
        getDelta();
        lastFPS = getTime();
    }
    public long getTime() {
        return (Sys.getTime() * 1000) / Sys.getTimerResolution();
    }

    public int getDelta() {
        long time = getTime();
        int delta = (int) (time - lastFrame);
        lastFrame = time;

        return delta;
    }
    public void updateFPS() {
        if (getTime() - lastFPS > 1000) {
            Display.setTitle(Integer.toString(fps));

            fps = 0;
            lastFPS += 1000;
        }
        fps++;
    }
    public int getFPS(){ return fps;}
}

1 ответ

Да, это правильно. Вы должны получить огромный скачок FPS, не имея Display.update() потому что приложение буквально не делает ничего, кроме итерации цикла и подсчета времени, которое требуется для выполнения этой итерации.

Сейчас это трудно увидеть, так как у вас нет компонентов, визуализируемых в Display, но не звонит Display.update() будет препятствовать тому, чтобы что-либо было визуализировано в окне дисплея.

Короче нужно Display.update() на самом деле сделать что-нибудь в LWJGL.

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

Другие вопросы по тегам