Java 检查按键是否比游戏循环快

Java 检查按键是否比游戏循环快,java,swing,user-interface,timer,Java,Swing,User Interface,Timer,我有一个名为Activity的类,它扩展了JPanel 我的问题是,我希望活动每1000毫秒运行一次游戏循环(更新其字段和GUI等),但总是检查(以便响应)按键 private final BitSet keys = new BitSet(256); ... public void keyPressed(final KeyEvent e) { keys.set(e.getKeyCode()); } public void keyReleased(final KeyEvent e)

我有一个名为
Activity
的类,它扩展了
JPanel

我的问题是,我希望
活动
每1000毫秒运行一次游戏循环(更新其字段和GUI等),但总是检查(以便响应)按键

private final BitSet keys = new BitSet(256);
...

public void keyPressed(final KeyEvent e) {
    keys.set(e.getKeyCode()); 
}

public void keyReleased(final KeyEvent e) {
    keys.clear(e.getKeyCode());
}

...

public void actionPerformed(ActionEvent e) {
  processKeys(); // Checks keys
  processData(); // Main game loop
  repaint();     // Draws game components
}
目前,该类将按键存储在
位集中,并且每隔1000毫秒,
actionPerformed()
查看按下的按键(如将玩家位置移动到右箭头的右侧),处理主要的游戏循环内容(如在命中边界时结束游戏),并按该顺序重新绘制屏幕

问题是,我必须在计时器启动之前按下一个键才能检测到它,否则在调用
processKeys()
时,它将从
位集中删除。我仍然希望游戏循环每1000毫秒运行一次

我也考虑过

  • 创建2个同步计时器——1000毫秒用于游戏循环,1毫秒用于按键分析
  • 将计时器设置为1ms,并使用类字段跟踪计时器触发。Check键在每次开火时按下,并且仅在
    开火%1000==0时运行游戏循环/重新绘制
  • 我不确定#1是否会造成性能问题或导致计时器不一致,我也很确定#2不可靠,因为当我尝试过它时,字段通常不会精确地达到1000或2000等


    解决方案是什么?

    正如您所发现的,由于按键和处理按键之间的延迟太长,因此可以在处理按键之前将其从
    位集中删除

    相反,使用两个
    位集
    s,一个用于按下键,一个用于释放键,在处理键后,从“按下键”集中删除“释放键”集中的所有项目,重置“释放键”集并继续

    当然,这是假设您想要处理在进程循环之间的1秒延迟期间键入的任何键


    另一种选择可能是实时实际处理关键事件,将其影响应用于某种“更改状态”,当流程循环发生时,可以将其应用于实际模型,但这与回答相同。我会试试你列出的第一个选项。至于第二个选项,我过去经常这样做,但根据下面的和,我觉得这是一个糟糕的事件处理实践。所以这真的不是“同一件事”,对吗?