Java2D 游戏随机卡顿。我究竟做错了什么?
Java2D game stutters randomly. What am I doing wrong?
我目前正在使用 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();
}
}
我曾多次尝试省略某些代码部分,认为它们会导致延迟,但我没有发现任何特别导致它的原因,所以我认为问题出在我的游戏循环机制上。
感谢您的帮助!
您的游戏循环必须包含 "Thread.sleep" 才能休眠达到您的目标 FPS 所需的时间。
主循环应该包含 1 个 tick() 和 1 个 render()。
您当前的实现正在充斥绘制管理器,当底层缓冲区已满以及垃圾收集器将完成其工作时,速度会变慢。
虽然将渲染和逻辑拆分为两种不同的方法很好,但问题在于它们存在于同一线程中。
减少延迟需要做的是将它们放在不同的线程中。呈现线程将从逻辑线程请求当前状态的快照(以防止并发修改)并呈现该快照。
现在,如果一个渲染花费的时间太长,或者如果一个逻辑步骤花费的时间太长,则另一个检查将不得不等待它完成才能开始工作。
我目前正在使用 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();
}
}
我曾多次尝试省略某些代码部分,认为它们会导致延迟,但我没有发现任何特别导致它的原因,所以我认为问题出在我的游戏循环机制上。 感谢您的帮助!
您的游戏循环必须包含 "Thread.sleep" 才能休眠达到您的目标 FPS 所需的时间。
主循环应该包含 1 个 tick() 和 1 个 render()。
您当前的实现正在充斥绘制管理器,当底层缓冲区已满以及垃圾收集器将完成其工作时,速度会变慢。
虽然将渲染和逻辑拆分为两种不同的方法很好,但问题在于它们存在于同一线程中。
减少延迟需要做的是将它们放在不同的线程中。呈现线程将从逻辑线程请求当前状态的快照(以防止并发修改)并呈现该快照。
现在,如果一个渲染花费的时间太长,或者如果一个逻辑步骤花费的时间太长,则另一个检查将不得不等待它完成才能开始工作。