Java Swing游戏随着时间的推移而滞后

时间:2013-02-05 08:57:25

标签: java swing graphics

我正在使用Java Swing制作游戏,我意识到在游戏运行一段时间后,大约10分钟左右,图形开始滞后很多。游戏循环报告以恒定的FPS运行。

现在我有了它,所以一旦游戏循环开火,也会调用重绘。如果我不同步图形,那么在屏幕上可以看到正在绘制的不同部分。任务管理器显示它使用的内存几乎相同,但CPU使用率会逐渐增加。如果我不得不猜测那就是我没有使用Swing来正确绘制。

我目前用于绘图的过程是这样的:

  • 投射graphics2D对象
  • 超级油漆图形对象
  • 每个对象都使用该图形对象绘制图形。
  • 工具包同步
  • 处理图片

面板为setDoubleBuffered(true)

有什么可能出错的想法吗?

编辑:

我无法让我的SSCCE滞后,所以我回去重新测试了每个绘制功能,事实证明

    int ilen = drawActorQueue.size();
    for (int i = 0; i < ilen; i++)
    {
        GameActor oo = drawActorQueue.get(i);
        oo.draw(g2d, viewX, viewY);
    }

似乎导致了这个问题。

我认为是因为drawActorQueue实际上包含指向2种类型对象的指针而GameActor只是基类。

看起来是这样的吗? 我想我可以通过使用接口来修复它,或者让列表指向2个子对象的特定数组。

编辑: !@#$%^ 这只是我非常愚蠢而且没有清除清单。当我再次疲惫时,我永远不会编码或调试。

2 个答案:

答案 0 :(得分:2)

确保您的应用不会大量泄漏内存和GC。使用详细的GC登录运行程序以查看它是否存在问题。

答案 1 :(得分:1)

将探查器附加到您的应用程序。

例如,visualvm。任何热点都应该通过“采样”快速出现。

visualvm的真正好处在于,您可以在问题真正发生时实际附加,但在发生问题之前全速运行。

它还会显示内存消耗和GC活动的图表。如果你看到你的应用程序在很短的时间内流失了很多内存,你可能想看看你是否可以减少它。

visualvm是一个超级强大,免费的Java工具,应该放在每个工具箱中,当你看到性能问题时,这是第一个去的地方。