【发布时间】:2018-02-01 16:49:02
【问题描述】:
我目前正在使用 Swing 组件开发 2D 游戏。 每次我运行我的游戏时,它都会在某些时候随机出现口吃。这是我的游戏循环代码:
public class FixedTSGameLoop implements Runnable
{
private MapPanel _gamePanel;
public FixedTSGameLoop(MapPanel panel)
{
this._gamePanel = panel;
}
@Override
public void run()
{
long lastTime = System.nanoTime(), now;
double amountOfTicks = 60.0;
double amountOfRenders = 120.0;
double nsTick = 1000000000 / amountOfTicks;
double nsRender = 1000000000 / amountOfRenders;
double deltaTick = 0;
double deltaRender = 0;
while (this._gamePanel.isRunning())
{
now = System.nanoTime();
deltaTick += (now - lastTime) / nsTick;
deltaRender += (now - lastTime) / nsRender;
lastTime = now;
while (deltaTick >= 1)
{
tick();
deltaTick--;
}
while (deltaRender >= 1)
{
render();
deltaRender--;
}
}
}
private void tick()
{
/**
* Logic goes here:
*/
this._gamePanel.setLogic();
}
private void render()
{
/**
* Rendering the map panel
*/
this._gamePanel.repaint();
}
}
我多次尝试省略某些代码部分,认为它们会导致延迟,但我没有发现任何特别导致它的原因,所以我认为问题出在我的游戏循环机制上。 感谢您的帮助!
【问题讨论】:
-
从另一个线程对 Swing 方法(包括
repaint)的任何调用都需要在 EDT 上使用SwingUtilities.invokeLater方法完成。 -
嗯,你能给我一个关于我的代码的例子吗?游戏循环的其他方面还好吗?
-
SwingUtilities.invokeLater( () -> _gamePanel.repaint() );为其中之一。您可能还需要对_gamePanel.setLogic();执行相同的操作。 -
同样的问题依然存在...
-
Each time I run my game it stutters randomly at some points.- 你有一个不断执行的 while 循环。游戏应该在某个时间间隔进行,以便 CPU 有机会休息。所以,你应该使用Swing Timer 来安排你想要的时间间隔玩游戏。
标签: java swing jpanel frame-rate game-loop