游戏循环滞后
Lags in game loop
这是我的游戏循环代码:
public void run() {
running = true;
boolean renderCheck = false;
double firstTime = 0;
double lastTime = System.nanoTime() / 1000000000.0;
double passedTime = 0;
double unprocessedTime = 0;
double frameTime = 0;
int frames = 0;
int fps = 0;
while (running) {
firstTime = System.nanoTime() / 1000000000.0;
passedTime = firstTime - lastTime;
lastTime = firstTime;
unprocessedTime += passedTime;
frameTime += passedTime;
while (unprocessedTime >= UPDATE_CAP) {
tick();
unprocessedTime -= UPDATE_CAP;
renderCheck = true;
}
if (frameTime >= 1.0) {
frameTime = 0;
fps = frames;
frames = 0;
System.out.println(fps);
}
if (renderCheck) {
render();
frames++;
renderCheck = false;
} else {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
这是一个渲染区:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics graphics = bs.getDrawGraphics();
graphics.setColor(Color.black);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
handler.render(graphics);
graphics.dispose();
bs.show();
}
这是打勾的部分(没有必要显示处理程序的其他代码,因为阅读起来太多了):
private void tick() {
handler.tick();
}
那么主要的问题就在接下来的事情上了。当我按下按钮时,我的角色必须开始移动。而且,实际上,它确实存在,但有一些延迟,使这个过程看起来很糟糕。一秒钟之后,一切都进行得很顺利。 (我已经检查了 CPU 加载 - 一切正常)
此问题仅在 linux PC 上发生。我已经在 Windows 10 上检查过它的 exe 格式,一切正常!有点奇怪。
这个延迟初始化可能是你的问题:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
...
您是否考虑过 render()
函数的第一次调用 getBufferStrategy()
将 return null
的事实,此时
你会先创建它(没关系)
然后 return 没有任何动作
(这很可疑)
render 的后续调用将实际执行渲染...稍后。 如果您确定无论如何都需要那个 bufferStrategy,那么立即创建它是有意义的初始化系统时。
Soo,我终于找到了解决这个问题的方法!
只需在您的静态 main 方法中通过编写以下代码将系统属性设置为 java2d:
public static void main(String argsp[]) {
System.setProperty("sun.java2d.opengl", "true");
new Game();
}
这是我的游戏循环代码:
public void run() {
running = true;
boolean renderCheck = false;
double firstTime = 0;
double lastTime = System.nanoTime() / 1000000000.0;
double passedTime = 0;
double unprocessedTime = 0;
double frameTime = 0;
int frames = 0;
int fps = 0;
while (running) {
firstTime = System.nanoTime() / 1000000000.0;
passedTime = firstTime - lastTime;
lastTime = firstTime;
unprocessedTime += passedTime;
frameTime += passedTime;
while (unprocessedTime >= UPDATE_CAP) {
tick();
unprocessedTime -= UPDATE_CAP;
renderCheck = true;
}
if (frameTime >= 1.0) {
frameTime = 0;
fps = frames;
frames = 0;
System.out.println(fps);
}
if (renderCheck) {
render();
frames++;
renderCheck = false;
} else {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
这是一个渲染区:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics graphics = bs.getDrawGraphics();
graphics.setColor(Color.black);
graphics.fillRect(0, 0, WIDTH, HEIGHT);
handler.render(graphics);
graphics.dispose();
bs.show();
}
这是打勾的部分(没有必要显示处理程序的其他代码,因为阅读起来太多了):
private void tick() {
handler.tick();
}
那么主要的问题就在接下来的事情上了。当我按下按钮时,我的角色必须开始移动。而且,实际上,它确实存在,但有一些延迟,使这个过程看起来很糟糕。一秒钟之后,一切都进行得很顺利。 (我已经检查了 CPU 加载 - 一切正常)
此问题仅在 linux PC 上发生。我已经在 Windows 10 上检查过它的 exe 格式,一切正常!有点奇怪。
这个延迟初始化可能是你的问题:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
...
您是否考虑过 render()
函数的第一次调用 getBufferStrategy()
将 return null
的事实,此时
你会先创建它(没关系)
然后 return 没有任何动作 (这很可疑)
render 的后续调用将实际执行渲染...稍后。 如果您确定无论如何都需要那个 bufferStrategy,那么立即创建它是有意义的初始化系统时。
Soo,我终于找到了解决这个问题的方法!
只需在您的静态 main 方法中通过编写以下代码将系统属性设置为 java2d:
public static void main(String argsp[]) {
System.setProperty("sun.java2d.opengl", "true");
new Game();
}