因线程交换而导致滞后

时间:2013-03-16 20:55:03

标签: java eclipse multithreading jvisualvm awt-eventqueue

在我开发的游戏中,我遇到了一些最近的延迟峰值。它是一致的,大约在同一时间发生。使用java profiler jvisualvm我发现它发生在特定线程似乎重启或同时(AWT-EventQueue-0):

Image of Thread changing channels

除此之外,没有明显的原因,不是堆使用,处理器使用,内存空间或方法使用。在绘制我的对象数组时,它有时会导致ConcurrentModificationException,但这只会发生很大的延迟,而且我的游戏几乎没有密集。

我不记得最近对该项目进行任何更改,但我最近执行了以下操作:

  • 将java更新到最新版本
  • 下载最新版本的JDK7(虽然它未在此项目中使用)
  • 修复因安装JDK7而导致的eclipse错误(删除256m限制 在eclipse.ini)

我在32位XP上运行Eclipse Indigo-service-1。我的处理器几乎没用过。

1 个答案:

答案 0 :(得分:5)

您似乎在事件调度线程(EDT)上执行太多。 AWT-Event-Queue-0看起来像是EDT。此外,您的上一条评论说

  

......当我将游戏板首先绘制到图像而不是直接绘制到组件时,似乎只出现延迟峰值。

你需要将一些计算推送到其他线程,听起来像绘制游戏板是一个很好的选择。此外,你可能有任何人工智能。

你的键盘&鼠标处理程序在EDT上运行,图形更新也需要。但是您可以在EDT之外预渲染到图像(就像您当前正在做的那样)。你可以发送键盘&通过BlockingQueue将鼠标事件发送到另一个线程。

您可以做的另一件事是将游戏更新率与帧更新率分开。

但没有任何细节,我无法给出更多建议。

更新 :(只需阅读ConcurrentModificationException

这可能是由两件不同的事情造成的:

  1. 您正在更新一个集合(如您的ArrayList),该集合与您正在阅读的集合中的线程不同;或
  2. 您正在遍历所述集合并在循环中更新它。
  3. 第2点很容易修复;但我担心我不能在如此短的空间内教授线程安全。