我正在用 Java 编写一个 2D 游戏,我遇到了输入事件(鼠标、键盘)没有在应该触发的时候触发的问题。它在 win2k 和 xp 中按预期工作。
因为这是一个游戏,所以我有一个主循环
- 合并输入事件(填充缓冲状态的各种监听器)
- 推进现场
- 渲染场景
- 必要时等待以保持稳定的帧速率( hibernate )
- 交换缓冲区
场景的渲染对 java2D 的影响很大——它使用 BufferStrategy 并大量使用 drawImage() 的非缩放变体。帧率暂时被人为锁定在 60fps 左右。
在任何鼠标或键盘事件发生与 JVM 拾取它之间似乎存在延迟(偶尔长达几秒)——最初我认为这可能是事件调度线程没有获得足够的时间(尽管帧率 sleep )- 我通过添加一个包含帧标记的自定义事件来测试它,并在帧结束时等待它,但它会在预期时触发(- 它应该只在所有其他先前事件都被触发后才这样做,这对我来说是一个 x -windows-to-jdk 问题,而不是 jdk 内部问题?)
特别奇怪的是,如果 java 以 +19 的 nice 运行(因此 降低 优先级......),它可以得到缓解。如果我有一个人口更多的场景,它似乎也会变得更糟 - 运行 top 显示 Xorg(而不是 java)占用了大约 80% 的 CPU,我怀疑这与它有关......
我也试过修改线程优先级,但没有明显区别......
我完全被这个问题难住了——有没有其他人看到过类似的行为,如果有,你是如何纠正它的?我是不是找错树了??
我正在运行 1.6.0 OpenJDK 和 fedora 11。
抱歉冗长,提前致谢!
最佳答案
我只是尝试将 Xorg 重新调整为 -19(所以它是实时的),问题就消失了......
我猜 java 通过 Xorg 渲染大量像素图会导致 X 本身占用 CPU,因此受到调度程序的惩罚而没有时间处理事件?奇怪。
关于Java inputevents 在 linux 中有一段时间没有触发(java/xorg 问题??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1619492/