Java游戏循环断断续续



在实践中,我尝试制作一个简单的程序,只需控制屏幕周围的正方形。我试着用插值来制作一个游戏循环,但我遇到了问题,它经常结结巴巴,我不知道为什么。我试着去掉Thread.sleep(1(;看看这是否是问题所在。如果我去掉这个,它实际上会减少卡顿,帧速率会从300帧左右跳到8000帧左右。当然,如果我把这个游戏做得更复杂,我就无法获得8000帧/秒的速度,所以我想看看如果我只有300帧/秒左右的速度,口吃是否仍然存在,所以我所做的就是在屏幕上添加一堆方块。这把fps降到了300左右,我注意到口吃又回来了。我看过Game loop和Fix your timestep,但找不到解决方案。我做错了什么?

游戏循环:

int targetUps = 60;
int timePerUpdate = 1_000_000_000 / targetUps;
long oldTime = System.nanoTime();
long newTime;
int accumulator = 0;
int upsTimer = 0;
int upsCounter = 0;
int fpsCounter = 0;
while(true) {
newTime = System.nanoTime();
accumulator += newTime - oldTime;
upsTimer += newTime - oldTime;
oldTime = newTime;
while(accumulator >= timePerUpdate) {
update();
accumulator -= timePerUpdate;
upsCounter++;
}
render(Math.min(1.0f, (double) accumulator / timePerUpdate));
fpsCounter++;
if(upsTimer >= 1_000_000_000) {
System.out.println("UPS: " + upsCounter + " | " + "FPS: " + fpsCounter);
fpsCounter = 0;
upsCounter = 0;
upsTimer = 0;
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

渲染方法:

private void render(double delta) {
BufferStrategy bs = window.getBufferStrategy();
Graphics g = bs.getDrawGraphics();
g.setColor(Color.DARK_GRAY);
g.fillRect(0,0,Window.WIDTH, Window.HEIGHT);
player.render(g, delta);
bs.show();
g.dispose();
}

播放器的渲染方法:

public void render(Graphics g, double delta) {
g.setColor(Color.GREEN);
double renderX = oldX + (x - oldX) * delta;
double renderY = oldY + (y - oldY) * delta;
g.fillRect((int) renderX, (int) renderY, 32, 32);
}

您需要使用类似delta的:

state = currentState * delta + previousState * ( 1.0 - delta );

当累加器等于timePerUpdate(60 FPS(时,增量将为0。

由于您的代码从不使用(1.0-delta(,

double renderX = oldX + (x - oldX) * delta;
double renderY = oldY + (y - oldY) * delta;

意味着你忽略了更新,因此结结巴巴。

最新更新