2014-11-08 3 views
1

를 늦추고 나는 자바 응용 프로그램에 대한 LWJGL을 사용하고 내가 Display.update()에 문제가있는 것 같다. 300 FPS - 난 단지 약 200 얻을 9000000. Display.update()와 - 나는 루프에서 Display.update()을 제거하면 나는 약 7,000,000에서 FPS를 얻을. 이게 정상인가?LWJGL Display.update() 응용 프로그램

Main.java

: 나는 1,7 GHz의 I7와 맥북 에어 2013을 사용하고

8GB의 RAM 및 인텔 HD 그래픽 여기에 5000

는 내가 가지고있는 코드입니다

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;} 
} 

답변

4

네, 맞습니다. 응용 프로그램이 문자 그대로 루프를 반복하고 반복을 수행하는 데 걸리는 시간을 계산하는 것 외에는 아무 것도하지 않고 있기 때문에 Display.update()을 가지지 않으면 막대한 FPS 점프를 얻어야합니다.

Display에 렌더링되는 구성 요소가 없으므로 Display.update()을 호출하지 않으면 디스플레이 창에 아무 것도 렌더링되지 않으므로 지금은보기 힘듭니다.

요약하면 LWJGL에서 실제로 어떤 작업을 수행하려면 Display.update()이 필요합니다. 그 외에는

, 당신은 응용 프로그램에서 시간을 관리하기위한 좋은 프레임 워크를 가지고있다. 나는 FPS를 제한하기 위해 '스로틀'을 추가 할 것을 제안합니다. 최대 속도로 게임을 실행하면 시간을 표준화 할 수없고 프로세서가 손상 될 수 있습니다.

+0

당신은 또한 사용할 수 있습니다 [Display.sync (FPS)] (http://www.lwjgl.org/javadoc/org/lwjgl/opengl/Display.html#sync (INT)) 당신의 프레임 속도를 조정합니다. – Dawnkeeper