Java inputevents 在 linux 中有一段时间没有触发(java/xorg 问题??)

标签 java linux xorg

我正在用 Java 编写一个 2D 游戏,我遇到了输入事件(鼠标、键盘)没有在应该触发的时候触发的问题。它在 win2k 和 xp 中按预期工作。

因为这是一个游戏,所以我有一个主循环

  1. 合并输入事件(填充缓冲状态的各种监听器)
  2. 推进现场
  3. 渲染场景
  4. 必要时等待以保持稳定的帧速率( hibernate )
  5. 交换缓冲区

场景的渲染对 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/

相关文章:

java - 蓝牙回调函数 onCharacteristicRead 没有对使用 <API 21 的另一个 Activity 进行 Intent 调用。不在 Marshmallow 中

java - 高效加载媒体缩略图

python - LocalAudioFile(file) 错误返回 OSError : [Errno 2] No such file or directory

compiler-errors - 无法编译Mesa,x.org

Java - 如何设置我的应用程序始终在主屏幕上运行但不在第二屏幕上运行?

java - java extends 关键字是引用变量吗?

java - JMockit 与 null 匹配

c - C程序在Linux上运行空闲时应该做什么?

linux - 在为 gdb 打开套接字之前 Pin 进程崩溃

linux - 重启后 xinput 更改触摸板的 id