我写一个游戏循环,我发现在下面的示例代码在这里.我还研究了其他方法来进行游戏循环,例如本文.我无法让任何那些工作.所以我保留了第一个链接中的那个.
我想知道的是:
Thread.sleep();在游戏循环中使用吗?这是我目前的代码:
public void run(){
long lastLoopTime = System.nanoTime();
final int TARGET_FPS = 60;
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
long lastFpsTime = 0;
while(true){
long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
double delta = updateLength / ((double)OPTIMAL_TIME);
lastFpsTime += updateLength;
if(lastFpsTime >= 1000000000){
lastFpsTime = 0;
}
this.updateGame(delta);
this.repaint();
try{
Room.gameTime = (lastLoopTime - System.nanoTime() + OPTIMAL_TIME) / 1000000;
System.out.println(Room.gameTime);
Thread.sleep(Room.gameTime);
}catch(Exception e){
}
}
Run Code Online (Sandbox Code Playgroud)
Wil*_*son 14
最终你会想要转向像LWJGL这样的东西,但让我强调,继续做你现在在做的事情.它将教你基本面.
你的循环很好.看起来不错,让我提供一些指示:
重绘不会立即渲染屏幕.它告诉RepaintManager在准备好时进行渲染.请改用paintImmediately使用invalidate .将阻止执行,直到重新绘制组件,以便您可以测量渲染时间.paintImmediately
Thread.sleep通常有几毫秒的漂移.你应该使用它来防止你的循环使用太多CPU,但要确保你知道你是否睡了10毫秒你可能会睡5毫秒或者你可能睡20.
最后:
double delta = updateLength / ((double)OPTIMAL_TIME);
Run Code Online (Sandbox Code Playgroud)
如果updateLength小于OPTIMAL_TIME,请不要调用update.换句话说,如果delta小于1,则不要更新.本教程解释了为什么比我更好.
总体而言,这是一个很好的循环,但我在经验中发现最好的循环有一些缺失的方面。
您最终会想要转向LWJGL或其他一些 Java 游戏 API,但现在,学习游戏循环如何工作的基础知识,以及什么最适合您的需求。
首先,回答你的一个观点,不。你会做得更好远离
线程.sleep()
这可能会偏离您设置的实际睡眠时间。
例如,如果您将它设置为休眠 10 毫秒,它可以使程序休眠 5 到 20 毫秒。
我立即看到的第二个问题是您没有任何方法可以停止自定义 stop() 方法的游戏循环。尝试
布尔运行 = 真;
while (running) {
// 你的代码在这里 //
}
第三,您可能需要考虑更改使用 delta 变量的方式。下面代码中的方式可能对你来说是更好的使用和构造。
这是我在程序中使用的游戏循环示例:
@Override
public void run() {
long initialTime = System.nanoTime();
final double timeU = 1000000000 / UPS;
final double timeF = 1000000000 / FPS;
double deltaU = 0, deltaF = 0;
int frames = 0, ticks = 0;
long timer = System.currentTimeMillis();
while (running) {
long currentTime = System.nanoTime();
deltaU += (currentTime - initialTime) / timeU;
deltaF += (currentTime - initialTime) / timeF;
initialTime = currentTime;
if (deltaU >= 1) {
getInput();
update();
ticks++;
deltaU--;
}
if (deltaF >= 1) {
render();
frames++;
deltaF--;
}
if (System.currentTimeMillis() - timer > 1000) {
if (RENDER_TIME) {
System.out.println(String.format("UPS: %s, FPS: %s", ticks, frames));
}
frames = 0;
ticks = 0;
timer += 1000;
}
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
45179 次 |
| 最近记录: |