我使用LWJGL作为Java应用程序,我似乎遇到了Display.update()
的问题。如果我从循环中删除Display.update()
,我会得到一个大约7000000 - 9000000的FPS。使用Display.update()
我只能获得大约200 - 300 FPS。这是正常的吗?
我使用的Macbook Air 2013配备1,7 GHz i7,8GB RAM和Intel HD Graphics 5000。
这是我的代码:
Main.java
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;}
}
答案 0 :(得分:4)
是的,这是正确的。你应该通过没有Display.update()
来获得大量的FPS跳跃,因为除了遍历循环并计算执行该迭代所花费的时间之外,应用程序实际上什么都不做。
现在很难看到这一点,因为你没有任何组件呈现给Display
,但是没有调用Display.update()
会阻止在显示窗口中呈现任何内容。
简而言之,您需要Display.update()
在LWJGL中实际执行任何操作。
除此之外,您还有一个很好的框架来管理应用程序中的时间。我建议添加一个'油门'来限制FPS。以最高速度运行游戏会使您无法标准化时间并伤害您的处理器。