Java Swing游戏滞后于时间

Java Swing游戏滞后于时间,java,swing,graphics,Java,Swing,Graphics,我正在用JavaSwing制作一个游戏,我意识到在游戏运行了一段时间后,大约10分钟左右,图形开始落后很多。游戏循环报告以恒定的FPS运行 现在我有了它,所以一旦游戏循环启动,重新绘制也会被调用。如果我不同步图形,绘制的不同部分在屏幕上可见的速度会非常慢。任务管理器显示它使用的内存几乎相同,但是CPU使用率随着时间的推移逐渐增加。如果我不得不猜测的话,那一定是因为我没有正确地使用Swing绘图 我目前用于绘图的过程如下所示: 投射图形2D对象 超级绘制图形对象 每个对象都使用该图形对象绘制其图

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

现在我有了它,所以一旦游戏循环启动,重新绘制也会被调用。如果我不同步图形,绘制的不同部分在屏幕上可见的速度会非常慢。任务管理器显示它使用的内存几乎相同,但是CPU使用率随着时间的推移逐渐增加。如果我不得不猜测的话,那一定是因为我没有正确地使用Swing绘图

我目前用于绘图的过程如下所示:

  • 投射图形2D对象
  • 超级绘制图形对象
  • 每个对象都使用该图形对象绘制其图形
  • 工具包同步
  • 处理图形
面板设置为双缓冲(真)

你知道可能出了什么问题吗

编辑:

我无法让我的SSCCE滞后,所以我回去重新测试了每个绘图函数,结果是

    int ilen = drawActorQueue.size();
    for (int i = 0; i < ilen; i++)
    {
        GameActor oo = drawActorQueue.get(i);
        oo.draw(g2d, viewX, viewY);
    }
int-ilen=drawActorQueue.size();
对于(int i=0;i
似乎是问题的根源

我认为这是因为drawActorQueue实际上包含指向两种类型对象的指针,GameActor只是基类

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

编辑: !@#$%^
只是我太愚蠢了,没有清理清单。我再也不会在极度疲劳时编写代码或进行调试。

确保你的应用程序不会严重泄漏内存和GC'ing。在详细GC登录的情况下运行该程序,查看是否存在问题。

确保您的应用程序没有严重内存泄漏和GC正在运行。在详细GC登录的情况下运行该程序,查看是否存在问题。

将探查器附加到应用程序

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

visualvm真正的优点在于,当问题真正发生时,您可以实际连接,但在问题发生之前全速运行

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


visualvm
是一款功能强大的Java免费工具,应该放在everybodys工具箱中,当您看到性能问题时,它是第一个可以使用的工具。

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

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

visualvm真正的优点在于,当问题真正发生时,您可以实际连接,但在问题发生之前全速运行

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


visualvm
是一款功能强大的Java免费工具,应该放在everybodys工具箱中,当您看到性能问题时,它是第一个可以使用的工具。

要获得更好的帮助,请尽快发布一个简短的、可运行的、可编译的
FileIO
,并使用硬编码值,
XxxStream
JDBC
同意@mKorbel的观点,即SSCCE是解决这个问题的方法,但请注意,“创建图形对象”对我来说似乎是可疑的。如果在组件中进行自定义绘制,通常会给您一个要使用的
Graphics
对象。该图形实例不应在您自己的代码中处理。“面板是
setDoubleBuffered(true)
”,这是
JPanel
的默认值。是的,我指的是参数中的图形对象。其他假设(在提供一个之前,这几乎是您将得到的):无限循环(如不断调用repaint(),或在paint()中调用repaint())或延迟太小的计时器。同时检查是否有异常;EDT将自动重新启动,但损坏可能是普遍的。为了更好地帮助您,请尽快发布一个简短、可运行、可编译且带有硬编码值的
FileIO
XxxStream
JDBC
同意@mKorbel的观点,即SSCE是解决此问题的方法,但请注意,“创建图形对象”对我来说似乎是可疑的。如果在组件中进行自定义绘制,通常会给您一个要使用的
Graphics
对象。该图形实例不应在您自己的代码中处理。“面板是
setDoubleBuffered(true)
”,这是
JPanel
的默认值。是的,我指的是参数中的图形对象。其他假设(在提供一个之前,这几乎是您将得到的):无限循环(如不断调用repaint(),或在paint()中调用repaint())或延迟太小的计时器。同时检查是否有异常;EDT将自动重新启动,但损坏可能是普遍的。