2014-01-28 15 views
0

我有一個問題的其他PC(不是一個IM一直在努力),用下面的代碼上:LWJGL Display.update()太慢 - 驅動程序的問題?

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) 

所以,你看到了錯誤的東西。但是什麼?包含我的代碼錯誤?我不知道...謝謝!

回答

1

除此之外,您使用大量過時的OpenGL功能,您將幀速率設置爲60 FPS。這將導致Display.update()在全屏期間等待垂直回掃(vsync)時被阻擋,該屏幕「按預期工作」。此外,許多OpenGL函數都是「緩存」的,並不像預期的那樣立即執行,而是由驅動程序進行內部優化,並在方便點執行(最近在Display.update())。這通常會提高性能和吞吐量,但也意味着測量單個OpenGL函數的時間變得幾乎不可能。

+0

60 FPS =每幀16.67毫秒,而不是測量的300毫秒。我猜測CPU-GPU總線在特定系統上的速度太慢,無法每幀傳輸每個粒子。 – Njol

+0

可能,但很難指出這要歸功於緩存。 – TwoThe

+0

那麼,我現在要做的是什麼?當我刪除同步()時,它幾乎相同。 –

0

嘗試切換Display.sync(60)和Display.update()。不是解決你的問題,但它也是一個解決方案。 同步只是等待60fps幀的休息時間,或者如果前一幀早於1/60秒前(因此當前幀低於60 fps,不需要通過等待更多地減少fps),就不要等待。

關於長時間運行的Display.update():idk,如果你想獲得一些有點複雜的東西,但你可以嘗試gDEBugger,它會告訴你GL所調用的和其他有用的信息,例如timing 。