这是我的游戏循环代码:
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上发生。我在Windows10上用EXE格式检查过,一切正常!有点奇怪。
最佳答案
这种延迟初始化可能是您的问题:
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
...
您是否考虑到在第一次调用
render()
函数时getBufferStrategy()
将在此时返回null
的事实?您将首先创建它(没关系)
然后不采取任何行动返回
(这是可疑的)
随后的render调用实际上会执行呈现…稍后。如果您确定无论如何都需要该缓冲策略,那么在初始化系统时直接创建它是有意义的。
关于java - 游戏循环中的滞后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54259276/