我正在用 Java 编写一个 2D 游戏,我遇到了输入事件(鼠标、键盘)在应该触发时没有触发的问题。它在 win2k 和 xp 中按预期工作。
因为它是一个游戏,所以我有一个主循环
- 合并输入事件(填充缓冲状态的各种侦听器)
- 推进场景
- 渲染场景
- 必要时等待以保持稳定的帧速率(睡眠)
- 交换缓冲区
场景的渲染对 java2D 的影响很大——它使用 BufferStrategy 并集中使用 drawImage() 的非缩放变体。帧率暂时被人为锁定在 60fps 左右。
在发生任何鼠标或键盘事件与 JVM 拾取它之间似乎存在延迟(有时长达几秒钟) - 最初我认为这可能是事件调度线程没有得到足够的时间(尽管帧率睡眠) - 我通过添加一个包含帧令牌的自定义事件并在帧结束时等待它来测试这一点,但它会在预期时触发( - 它应该只在所有其他先前事件触发后才会这样做,这表明它是一个 x-windows- to-jdk 问题,而不是 jdk 内部的问题?)
特别奇怪的是,如果java以+19的nice运行(所以优先级较低......),它可以得到缓解。如果我有一个人口更稠密的场景,它似乎也会变得更糟——运行 top 显示 Xorg(而不是 java)占用了大约 80% 的 CPU,我怀疑这与它有关......
我也尝试过修改线程优先级,但没有明显区别......
我完全被这个问题难住了——有没有其他人看到过类似的行为,如果是这样,你是如何纠正的?我在吠叫错误的树吗??
我正在运行 1.6.0 OpenJDK 和 fedora 11。
为冗长道歉,并在此先感谢!