Java LWJGL Display.update()减慢应用程序速度

Java LWJGL Display.update()减慢应用程序速度,java,performance,lwjgl,frame-rate,Java,Performance,Lwjgl,Frame Rate,我正在使用一个Java应用程序,我似乎在Display.update()方面有问题。如果我从循环中删除Display.update()。使用Display.update()。这正常吗 我使用的是MacBookAir 2013,配备1.7GHz i7、8GB RAM和Intel HD Graphics 5000 以下是我的代码: Main.java class Main{ private static Time time; public static void main(Strin

我正在使用一个Java应用程序,我似乎在
Display.update()
方面有问题。如果我从循环中删除
Display.update()。使用
Display.update()
。这正常吗

我使用的是MacBookAir 2013,配备1.7GHz i7、8GB RAM和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();
    }
}
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;}
}
Time.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();
    }
}
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;}
}

是的,这是正确的。通过不使用
Display.update()
,您应该可以获得巨大的FPS跳跃,因为应用程序除了迭代循环并计算执行该迭代所需的时间外,实际上什么都不做

现在很难看到这一点,因为您没有任何组件渲染到
显示
,但不调用
显示.update()
将阻止在显示窗口中渲染任何内容

简而言之,您需要
Display.update()
在LWJGL中实际执行任何操作。


除此之外,您还有一个很好的框架来管理应用程序中的时间。我建议增加一个“油门”来限制FPS。以最大速度运行游戏会使您无法标准化时间,并损害处理器。

是的,这是正确的。通过不使用
Display.update()
,您应该可以获得巨大的FPS跳跃,因为应用程序除了迭代循环并计算执行该迭代所需的时间外,实际上什么都不做

现在很难看到这一点,因为您没有任何组件渲染到
显示
,但不调用
显示.update()
将阻止在显示窗口中渲染任何内容

简而言之,您需要
Display.update()
在LWJGL中实际执行任何操作。

除此之外,您还有一个很好的框架来管理应用程序中的时间。我建议增加一个“油门”来限制FPS。以最大速度运行游戏会使您无法标准化时间,并损害处理器。

您还可以使用来调整帧速率。您也可以使用来调整帧速率。