为了清楚起见,我正在寻找实现游戏循环的最佳替代方案'在Java中(使用Swing)。
目前,我在paintComponent()
课程中使用JPanel
覆盖了以下设置来绘制这样的内容:
public void run() {
while (running) {
panel.update();
panel.repaint();
try {
sleep(SLEEP_TIME);
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
这种设置似乎工作得很整齐,但移动的形状和图像似乎有时会出现一两个像素。换句话说,这种运动并不像我想的那样顺畅。
我想知道是否有办法更有效地进行游戏循环,即以避免在运动中出现口吃?
答案 0 :(得分:1)
使循环速率固定的简便方法是使用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();
}
}
}