4

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

换线通道图片

除此之外,没有明显的原因,不在堆使用、处理器使用、内存空间或方法使用中。有时它会ConcurrentModificationException在绘制我的对象数组时导致出现问题,但这只会在大量滞后的情况下发生,而且我的游戏几乎不会密集。

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

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

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

4

1 回答 1

5

看来您在事件调度线程 (EDT) 上做的太多了。AWT-Event-Queue-0 看起来是 EDT。此外,您的最后一条评论说

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

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

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

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

但是没有任何细节,我无法提供更多建议。

更新:(只需阅读您的一点ConcurrentModificationException

这可能是由两种不同的原因引起的:

  1. 您正在与您正在阅读的线程不同的线程中更新一个集合(如您的 ArrayList);或者
  2. 您正在遍历所述集合并在循环中对其进行更新。

第2点很容易修复;但恐怕我无法在这么短的空间内教授线程安全。

于 2013-03-17T00:26:20.587 回答