gpt4 book ai didi

java - 游戏循环卡顿

转载 作者:行者123 更新时间:2023-11-30 01:53:28 24 4
gpt4 key购买 nike

我是 Java 初学者。我尝试使用 Swing 创建一个简单的程序,其中有许多球在弹跳。程序运行良好,流畅,每秒 60 帧,没有卡顿。然而CPU一直以20%的速度运行。后来我在某处读到,我可以通过在循环末尾添加 Thread.sleep 方法来限制 CPU 使用率。但是,如果我这样做,程序有时会出现卡顿。我不知道为什么,我没有改变任何其他东西。它并不总是卡顿,有时即使我运行程序很长时间,它也根本不卡顿。但有时一打开程序就开始卡顿。另外,当它卡顿时,FPS 仍然显示 60。那么我做错了什么吗?

这是游戏循环:

    long currentTime;
long lastTime = System.nanoTime();
int targetFps = 60;
int timePerTick = 1000000000 / targetFps;
long delta = 0;
long fpsTimer = 0;
int fpsCounter = 0;

while(running) {
currentTime = System.nanoTime();
delta += currentTime - lastTime;
fpsTimer += currentTime - lastTime;
lastTime = currentTime;
if(delta >= timePerTick) {
fpsCounter++;
update();
render();
delta -= timePerTick;

}
if(fpsTimer >= 1000000000) {
System.out.println("FPS: " + fpsCounter);
fpsTimer = 0;
fpsCounter = 0;
}

try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

最佳答案

您不应以达到每秒 60 帧为目标。相反,您应该以每 1/60 秒获取 1 帧为目标。

差异以及您在 60FPS 时看到延迟的原因是,目前如果您由于任何原因看到 200 毫秒的延迟,您只需在剩余的 800 毫秒内渲染 59 帧。这仍然达到 60 FPS,但显然对体验没有任何意义。

您可以改为为每帧分配约 16 毫秒。如果一帧花费的时间较少,则剩余的时间将 hibernate 。如果需要更多时间,请跳过下一帧的 render()(但保留 update(),除非您可以重写它以支持流畅的时间步长)。这样,您的 FPS 数字将更具代表性,并将显示您当前通过长期平均来掩盖的所有各种调度和 GC 问题。

关于java - 游戏循环卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55269052/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com