【问题标题】:Java Swing game lags over timeJava Swing 游戏随着时间的推移而滞后
【发布时间】:2013-01-20 03:25:09
【问题描述】:

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

现在我有它,所以一旦游戏循环触发,也会调用 repaint。如果我不同步图形,那么在屏幕上可以看到正在绘制的不同部分的速度太慢了。任务管理器显示它使用的内存几乎相同,但是 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 个子对象的特定数组。

编辑: !@#$%^ 只是我非常愚蠢,没有清理清单。当我再次感到疲倦时,我永远不会编码或调试。

【问题讨论】:

  • 为了获得更好的帮助,请尽快发布SSCCE,简短、可运行、可使用FileIOXxxStreamJDBC 的硬编码值进行编译
  • 同意@mKorbel 的观点,SSCCE 是通往这里的道路,但请注意“创建图形对象” 对我来说似乎很可疑。如果在组件中进行自定义绘制,通常会给您一个 Graphics 对象来使用。该图形实例不应在您自己的代码中处理。 “面板是setDoubleBuffered(true)。” 这是JPanel 的默认值。
  • 是的,我的意思是参数中的图形对象。
  • 其他假设(在您提供SSCCE 之前,这几乎是您所能得到的全部):无限循环(例如不断调用 repaint(),或在 paint() 中调用 repaint())或 Timer延迟太小。
  • 同时检查吞咽异常; EDT 将自动重启,但损坏可能无处不在。

标签: java swing graphics


【解决方案1】:

确保您的应用没有严重泄漏内存和 GC。使用详细的 GC 登录运行程序,看看是否有问题。

【讨论】:

    【解决方案2】:

    将分析器附加到您的应用程序。

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

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

    它还会显示内存消耗和 GC 活动的图表。如果您看到您的应用程序在短时间内消耗大量内存,您可能想看看是否可以减少这种情况。

    visualvm 是一个超级强大的免费 Java 工具,应该在每个人的工具箱中,当您发现性能问题时,首先要去看看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 1970-01-01
      相关资源
      最近更新 更多