在我开发的游戏中,我遇到了一些最近的延迟峰值。它是一致的,大约在同一时间发生。使用java profiler jvisualvm我发现它发生在特定线程似乎重启或同时(AWT-EventQueue-0):
除此之外,没有明显的原因,不是堆使用,处理器使用,内存空间或方法使用。在绘制我的对象数组时,它有时会导致ConcurrentModificationException
,但这只会发生很大的延迟,而且我的游戏几乎没有密集。
我不记得最近对该项目进行任何更改,但我最近执行了以下操作:
我在32位XP上运行Eclipse Indigo-service-1。我的处理器几乎没用过。
答案 0 :(得分:5)
您似乎在事件调度线程(EDT)上执行太多。 AWT-Event-Queue-0看起来像是EDT。此外,您的上一条评论说
......当我将游戏板首先绘制到图像而不是直接绘制到组件时,似乎只出现延迟峰值。
你需要将一些计算推送到其他线程,听起来像绘制游戏板是一个很好的选择。此外,你可能有任何人工智能。
你的键盘&鼠标处理程序在EDT上运行,图形更新也需要。但是您可以在EDT之外预渲染到图像(就像您当前正在做的那样)。你可以发送键盘&通过BlockingQueue将鼠标事件发送到另一个线程。
您可以做的另一件事是将游戏更新率与帧更新率分开。
但没有任何细节,我无法给出更多建议。
更新 :(只需阅读ConcurrentModificationException
)
这可能是由两件不同的事情造成的:
第2点很容易修复;但我担心我不能在如此短的空间内教授线程安全。