Java主游戏循环
作者:互联网
我正在写一个游戏循环,我在here下面的示例中找到了代码.我还看了其他方法来进行游戏循环,例如从this article开始.我无法获得任何那些工作.所以我保留了第一个链接中的那个.
我想知道的是:
>我编写游戏循环的方式是一种很好的方法吗?
>有什么建议吗?
>我应该使用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){
}
}
解决方法:
最终你会想要转向像LWJGL这样的东西,但是让我强调,继续做你现在在做的事.它将教你基本面.
你的循环很好.看起来不错,让我提供一些指示:
>重绘不会立即渲染屏幕.它告诉RepaintManager在准备好时进行渲染.请使用invalidate paintImmediately. paintImmediately将阻止执行,直到重新绘制组件,以便您可以测量渲染时间.
> Thread.sleep通常有几毫秒的漂移.你应该使用它来防止你的循环使用太多CPU,但要确保你知道你是否睡了10毫秒你可能会睡5毫秒或者你可能睡20.
>最后:
double delta = updateLength / ((double)OPTIMAL_TIME);
如果updateLength小于OPTIMAL_TIME,请不要调用update.换句话说,如果delta小于1,则不要更新. This tutorial解释了为什么比我更好.
标签:java,game-engine 来源: https://codeday.me/bug/20190922/1813305.html