我在另一台PC上遇到问题(不是那个我一直在工作的人),使用以下代码:
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)
所以,你看到有些不对劲。但是什么?包含我的Code错误?我不知道......谢谢!
答案 0 :(得分:1)
除了使用严重过时的OpenGL功能外,您还可以将帧速率设置为60 FPS。这将导致Display.update()
在全屏期间等待垂直回扫(vsync)时阻塞,这是“按预期工作”。
此外,许多OpenGL函数都是“缓存”的,并没有像人们期望的那样立即执行,而是由驱动程序在内部优化并在方便的位置执行(最新的Display.update()
)。这通常会提高性能和吞吐量,但也意味着测量单个OpenGL函数的时间几乎是不可能的。