Java Swing';游戏循环';最佳做法
为了清楚起见,我正在寻找用Java(使用Swing)实现“游戏循环”的最佳替代方案 目前,我正在使用Java Swing';游戏循环';最佳做法,java,swing,loops,Java,Swing,Loops,为了清楚起见,我正在寻找用Java(使用Swing)实现“游戏循环”的最佳替代方案 目前,我正在使用paintComponent()在JPanel类中覆盖的以下设置来绘制这样的东西: public void run() { while (running) { panel.update(); panel.repaint(); try { sleep(SLEEP_TIME); } catch (Excep
paintComponent()
在JPanel
类中覆盖的以下设置来绘制这样的东西:
public void run() {
while (running) {
panel.update();
panel.repaint();
try {
sleep(SLEEP_TIME);
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
这种设置看起来很灵活,但移动的形状和图像有时会出现一两个像素的停顿。换句话说,运动并不像我希望的那样平稳
我想知道是否有一种方法可以更有效地进行游戏循环,即避免动作中的口吃?一种简单的固定循环速率的方法是使用
ScheduledExecutorService
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
panel.update();
panel.repaint();
}, 0, 16, TimeUnit.MILLISECONDS);
另一种方法是根据睡眠时间计算自己的睡眠时间
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();
}
}
}
使循环率固定。我该怎么做?睡眠时间的值是多少?Swing通常可以实现非常高的帧速率。口吃很可能是由于您的程序编写的某些方式造成的,并且您提供的小样本不足以确定问题。请参见SLEEP_TIME的值为16。在绘制图形时,它是否使用某种并发锁,以便在更新图形时无法进行绘制?否则,如果你画一些新外观只更新了一半的形状,它们很容易结巴。