Java LWJGL Display.update()减慢应用程序速度
我正在使用一个Java应用程序,我似乎在Java LWJGL Display.update()减慢应用程序速度,java,performance,lwjgl,frame-rate,Java,Performance,Lwjgl,Frame Rate,我正在使用一个Java应用程序,我似乎在Display.update()方面有问题。如果我从循环中删除Display.update()。使用Display.update()。这正常吗 我使用的是MacBookAir 2013,配备1.7GHz i7、8GB RAM和Intel HD Graphics 5000 以下是我的代码: Main.java class Main{ private static Time time; public static void main(Strin
Display.update()
方面有问题。如果我从循环中删除Display.update()。使用Display.update()
。这正常吗
我使用的是MacBookAir 2013,配备1.7GHz 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();
}
}
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;}
}
Time.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();
}
}
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;}
}
是的,这是正确的。通过不使用Display.update()
,您应该可以获得巨大的FPS跳跃,因为应用程序除了迭代循环并计算执行该迭代所需的时间外,实际上什么都不做
现在很难看到这一点,因为您没有任何组件渲染到显示
,但不调用显示.update()
将阻止在显示窗口中渲染任何内容
简而言之,您需要Display.update()
在LWJGL中实际执行任何操作。
除此之外,您还有一个很好的框架来管理应用程序中的时间。我建议增加一个“油门”来限制FPS。以最大速度运行游戏会使您无法标准化时间,并损害处理器。是的,这是正确的。通过不使用Display.update()
,您应该可以获得巨大的FPS跳跃,因为应用程序除了迭代循环并计算执行该迭代所需的时间外,实际上什么都不做
现在很难看到这一点,因为您没有任何组件渲染到显示
,但不调用显示.update()
将阻止在显示窗口中渲染任何内容
简而言之,您需要Display.update()
在LWJGL中实际执行任何操作。
除此之外,您还有一个很好的框架来管理应用程序中的时间。我建议增加一个“油门”来限制FPS。以最大速度运行游戏会使您无法标准化时间,并损害处理器。您还可以使用来调整帧速率。您也可以使用来调整帧速率。