作为练习,我试着做了一个简单的程序,你所要做的就是控制屏幕周围的方块。我试着用插值法做一个游戏循环,但是我对它有问题,它经常卡顿,我不知道为什么。我已尝试删除Thread.sleep(%1);以确定这是否是问题所在。如果我去掉它,它实际上会减少卡顿,fps会从300fps左右跳到8000fps左右。当然,如果我让这个游戏变得更复杂,我就不能得到8000fps,所以我想看看如果我只有大约300fps,是否仍然存在卡顿,所以我所做的就是在屏幕上添加了一堆方块。这使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();
}
}render方法:
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();
}Player`s的渲染方法:
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);
}发布于 2021-05-23 04:13:45
你需要像这样使用增量:
state = currentState * delta + previousState * ( 1.0 - delta );当累加器等于timePerUpdate (60 FPS)时,增量将为0。
由于您的代码从不使用(1.0 -增量),
double renderX = oldX + (x - oldX) * delta;
double renderY = oldY + (y - oldY) * delta;意味着您忽略了更新,因此出现了卡顿。
https://stackoverflow.com/questions/67594462
复制相似问题