2013-02-05 47 views
0

我正在用Java Swing制作游戏,并且我已经意识到在游戏运行了一段时间10分钟左右之后,图形开始落后了很多。游戏循环报告以恒定的FPS运行。随着时间的推移Java Swing游戏滞后

现在我拥有了,所以一旦游戏循环触发时重绘也被调用。如果我不同步图形,它很慢,画出的不同部分在屏幕上可见。任务管理器显示它使用的内存几乎相同,但随着时间的推移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个子对象的特定数组。

编辑: !@#$%^ 这只是我令人难以置信的愚蠢,没有清除清单。当我再次疲倦时,我永远不会编码或调试。

+3

更快速地发布[SSCCE](http://sscce.org/),简短,可运行,可编译为'FileIO','XxxStream'或'JDBC'的硬编码值 – mKorbel

+2

同意@mKorbel SSCCE是去这里的路,但注意*“创建图形对象”*似乎对我很可疑。如果在组件中进行自定义绘画,通常会给出一个Graphics对象来处理。该图形实例不应该放置在您自己的代码中。 *“面板是'setDoubleBuffered(true)'。”*这是'JPanel'的默认值。 –

+0

是的,我的意思是参数中的图形对象。 –

回答

2

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

1

将分析器附加到您的应用程序。例如,visualvm。 “采样”可以快速启动任何热点。

visualvm的真正好处在于,当问题真的发生时,您可以真正关注,但在发生问题之前全速运行。

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

visualvm是一款适用于Java的超级强大免费工具,应该可以安装在每个工具箱中,并且是您查看性能问题时的首选地点。

相关问题