我目前正在使用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();
}
}
我已多次尝试省略某些代码部分,认为它们会造成滞后,但我发现没有什么特别引起它,所以我认为问题在于我的游戏循环机制。 谢谢你的帮助!
答案 0 :(得分:0)
你的游戏循环必须包含一个" Thread.sleep"为了睡眠所需的时间来尊重你的目标FPS。
主循环应该包含1个tick()和1个render()。
您当前的实现充斥着绘制管理器,当底层缓冲区已满并且垃圾收集器将完成其工作时,将出现减速。
答案 1 :(得分:0)
虽然您可以用两种不同的方法拆分渲染和逻辑,但问题在于它们存在于同一个线程中。
减少延迟需要做的是将它们放在单独的线程中。渲染线程将从逻辑线程请求快照当前状态(以防止并发修改)并渲染该快照。
现在,如果一个渲染需要太长时间,或者一个逻辑步骤需要太长时间,另一个检查将不得不等待它完成才能开始工作。