나는 다음과 같은 코드를 가진 다른 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)
그럼 뭔가 잘못되었습니다. 근데 뭐? 코드 오판을 포함합니까? 나도 몰라 ... 고마워!
프레임 당 60 FPS = 16.67 ms, 측정 된 300 ms가 아닙니다. 나는 CPU-GPU 버스가 매 프레임마다 각 입자를 전송할 수 있도록 특정 시스템에서 너무 느리다 고 생각한다. – Njol
아마도 그렇지만 캐싱 덕분에 그 점을 정확하게 지적하는 것은 어렵습니다. – TwoThe
그럼 지금해야 할 일은 무엇입니까? sync()를 제거하면 거의 동일합니다. –