【问题标题】:LWJGL Display.update() too slow - driver issue?LWJGL Display.update() 太慢 - 驱动程序问题?
【发布时间】:2014-01-28 13:34:36
【问题描述】:

我在另一台电脑上遇到问题(不是我一直在使用的电脑),代码如下:

public void run(){
        initStuff();
        initWindow();
        initGl();
        initTextures();
        initParticles();
        long lastFrame = System.currentTimeMillis();
        long thisFrame;
        long delta;
        long time;
        while(true){
            glPushMatrix();
            thisFrame = System.currentTimeMillis();
            delta = thisFrame - lastFrame;
            lastFrame = thisFrame;
            System.out.println("[start loop] (last loop took " + delta + " ms)");
            time = System.currentTimeMillis();
            System.out.println("---clearing");
            time = System.currentTimeMillis();
            glClear(GL_COLOR_BUFFER_BIT);
            System.out.println("------myupdating (clearing took " + (System.currentTimeMillis() - time) + " ms)");
            time = System.currentTimeMillis();
            myupdate();
            System.out.println("---------painting (mydating took " + (System.currentTimeMillis() - time) + " ms)");
            time = System.currentTimeMillis();
            draw();
            System.out.println("------------syncing (painting took " + (System.currentTimeMillis() - time) + " ms)");
            time = System.currentTimeMillis();
            Display.sync(60);
            System.out.println("---------------disp updating (syncing took " + (System.currentTimeMillis() - time) + " ms)");
            time = System.currentTimeMillis();
            Display.update();
            System.out.println("------------------[end loop] (updating took " + (System.currentTimeMillis() - time) + " ms)");
            glPopMatrix();
        }
//      Display.destroy();
    }

    private void myupdate(){

    }

    private void draw(){
        background.use();
        glBegin(GL_QUADS);
            glTexCoord2f(0, 0);
            glVertex2d(0, 0);
            glTexCoord2f(1, 0);
            glVertex2d(800, 0);
            glTexCoord2f(1, 1);
            glVertex2d(800, 600);
            glTexCoord2f(0, 1);
            glVertex2d(0, 600);
        glEnd();
        for(Particle p: particles){
            p.getTexture().use();
            glBegin(GL_QUADS);
                glTexCoord2f(0, 0);
                glVertex2d(p.getX(), p.getY());
                glTexCoord2f(1, 0);
                glVertex2d(p.getX() + p.getWidth(), p.getY());
                glTexCoord2f(1, 1);
                glVertex2d(p.getX() + p.getWidth(), p.getY() + p.getHeight());
                glTexCoord2f(0, 1);
                glVertex2d(p.getX(), p.getY() + p.getHeight());
            glEnd();
            p.setX(p.getX() + 1);
        }

所以,我添加了所有时间输出以查看它在哪里减慢 - 答案是 Display.update()。以下输出:

[start loop] (last loop took 340 ms)
---clearing
------myupdating (clearing took 0 ms)
---------painting (mydating took 0 ms)
------------syncing (painting took 11 ms)
---------------disp updating (syncing took 0 ms)
------------------[end loop] (updating took 330 ms)
[start loop] (last loop took 341 ms)
---clearing
------myupdating (clearing took 0 ms)
---------painting (mydating took 0 ms)
------------syncing (painting took 12 ms)
---------------disp updating (syncing took 0 ms)
------------------[end loop] (updating took 332 ms)
[start loop] (last loop took 345 ms)
---clearing
------myupdating (clearing took 0 ms)
---------painting (mydating took 0 ms)
------------syncing (painting took 12 ms)
---------------disp updating (syncing took 0 ms)
------------------[end loop] (updating took 331 ms)
[start loop] (last loop took 343 ms)
---clearing
------myupdating (clearing took 0 ms)
---------painting (mydating took 0 ms)
------------syncing (painting took 12 ms)
---------------disp updating (syncing took 0 ms)

所以,您发现有问题。但是什么?包含我的代码错误?我不知道...谢谢!

【问题讨论】:

    标签: java performance time lwjgl


    【解决方案1】:

    除了您使用严重过时的 OpenGL 功能外,您还将帧速率设置为 60 FPS。这将导致 Display.update() 在全屏期间等待垂直回扫 (vsync) 时被阻塞,这是“按预期工作”。

    此外,许多 OpenGL 函数是“缓存”的,不会像预期的那样立即执行,而是由驱动程序在内部优化并在方便的位置执行(最新于 Display.update())。这通常会提高性能和吞吐量,但也意味着测量单个 OpenGL 函数的时间几乎是不可能的。

    【讨论】:

    • 60 FPS = 16.67 毫秒每帧,而不是测量的 300 毫秒。我猜这个特定系统上的 CPU-GPU 总线太慢了,无法每帧传输每个粒子。
    • 可能,但由于缓存,很难确定。
    • 那么,我现在该怎么办?当我删除 sync() 时,它几乎是一样的。
    • 减少粒子并切换到现代 OpenGL(3.0 或更高版本)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2015-01-15
    相关资源
    最近更新 更多