2014-01-28 2 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 기능을 많이 사용하는 것 외에도 프레임 속도를 60FPS로 설정합니다. 이로 인해 Display.update()이 전체 화면 ("의도 한대로 작동 함") 동안 수직 귀선 (vsync)을 기다리는 동안 차단됩니다.

또한 많은 OpenGL 함수가 "캐싱"되어 예상대로 실행되지 않지만 드라이버에 의해 내부적으로 최적화되고 편리한 지점 (최신 Display.update())에서 실행됩니다. 이것은 대개 성능과 처리량을 향상 시키지만, 단일 OpenGL 기능의 시간 측정은 거의 불가능 함을 의미합니다.

+0

프레임 당 60 FPS = 16.67 ms, 측정 된 300 ms가 아닙니다. 나는 CPU-GPU 버스가 매 프레임마다 각 입자를 전송할 수 있도록 특정 시스템에서 너무 느리다 고 생각한다. – Njol

+0

아마도 그렇지만 캐싱 덕분에 그 점을 정확하게 지적하는 것은 어렵습니다. – TwoThe

+0

그럼 지금해야 할 일은 무엇입니까? sync()를 제거하면 거의 동일합니다. –

0

Display.sync (60) 및 Display.update()를 전환 해보십시오. 당신의 문제를 해결하는 것이 아니라 그것을 고치는 것입니다. 싱킹은 60fps 프레임을 만들기 위해 휴식 시간을 기다리거나, 이전 프레임이 1/60 초 이전보다 빠르면 기다리지 않습니다 (따라서 현재 프레임은 60fps보다 작아서 대기로 인해 fps를 더 줄일 필요가 없습니다).

다소 복잡한 일을하고 싶지만 gDEBugger를 사용해 볼 수있는 경우 Display.update() : idk를 실행하면 GL이 호출하는 것과 기타 유용한 정보 (타이밍 등)가 표시됩니다. .