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

时间:2014-11-08 12:28:43

标签: java performance lwjgl frame-rate

我使用LWJGL作为Java应用程序,我似乎遇到了Display.update()的问题。如果我从循环中删除Display.update(),我会得到一个大约7000000 - 9000000的FPS。使用Display.update()我只能获得大约200 - 300 FPS。这是正常的吗?

我使用的Macbook Air 2013配备1,7 GHz 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();
    }
}

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 个答案:

答案 0 :(得分:4)

是的,这是正确的。你应该通过没有Display.update()来获得大量的FPS跳跃,因为除了遍历循环并计算执行该迭代所花费的时间之外,应用程序实际上什么都不做。

现在很难看到这一点,因为你没有任何组件呈现给Display,但是没有调用Display.update()会阻止在显示窗口中呈现任何内容。

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

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