2015-04-15 95 views
1

为了清楚起见,我正在寻找最好的替代方案来实现Java中的'游戏循环'(使用Swing)。Java Swing'游戏循环'最佳实践

目前,我使用的是paintComponent()以下设置在JPanel类中重写绘制的东西,像这样:

public void run() { 
    while (running) { 
     panel.update(); 
     panel.repaint(); 
     try { 
      sleep(SLEEP_TIME); 
     } catch (Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

这种设置似乎整齐的工作,但移动图形和图像好像口吃了像素或两次。换句话说,这个运动并不像我希望的那样流畅。

我想知道是否有办法更有效地完成游戏循环,避免在运动中出现口吃?

+0

使循环率固定。 – Bubletan

+0

我该怎么做? – noobcoder

+0

'SLEEP_TIME'的价值是什么?摆动通常可以实现非常高的帧速率。口吃可能是由于您的程序编写过程的某种方式,而您提供的小样本不足以确定问题。请参阅http://stackoverflow.com/help/mcve – Radiodef

回答

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(); 
     } 
    } 
}