为了清楚起见,我正在寻找在 Java 中实现“游戏循环”的最佳替代方案(使用 Swing)。
目前,我正在使用以下设置,并在 JPanel
类中覆盖 paintComponent()
来绘制如下内容:
public void run() {
while (running) {
panel.update();
panel.repaint();
try {
sleep(SLEEP_TIME);
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
此设置似乎运行良好,但移动形状和图像有时似乎会卡顿一两个像素。换句话说, Action 并不像我希望的那么顺利。
我想知道是否有一种方法可以更有效地进行游戏循环,即避免运动中的卡顿?
最佳答案
固定周期率的一个简单方法是使用 ScheduledExecutorService
。
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
panel.update();
panel.repaint();
}, 0, 16, TimeUnit.MILLISECONDS);
另一种方法是自己完成,根据该过程所用的时间计算 sleep 时间。
public void run() {
long time = System.currentTimeMillis();
while (running) {
panel.update();
panel.repaint();
long sleep = 16 - (System.currentTimeMillis() - time);
time += 16;
try {
sleep(sleep);
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
关于Java Swing 'game loop' 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29657353/