我正在使用Java Swing制作游戏,我意识到在游戏运行一段时间后,大约10分钟左右,图形开始滞后很多。游戏循环报告以恒定的FPS运行。
现在我有了它,所以一旦游戏循环开火,也会调用重绘。如果我不同步图形,那么在屏幕上可以看到正在绘制的不同部分。任务管理器显示它使用的内存几乎相同,但CPU使用率会逐渐增加。如果我不得不猜测那就是我没有使用Swing来正确绘制。
我目前用于绘图的过程是这样的:
面板为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个子对象的特定数组。
编辑: !@#$%^ 这只是我非常愚蠢而且没有清除清单。当我再次疲惫时,我永远不会编码或调试。
答案 0 :(得分:2)
确保您的应用不会大量泄漏内存和GC。使用详细的GC登录运行程序以查看它是否存在问题。
答案 1 :(得分:1)
将探查器附加到您的应用程序。
例如,visualvm
。任何热点都应该通过“采样”快速出现。
visualvm的真正好处在于,您可以在问题真正发生时实际附加,但在发生问题之前全速运行。
它还会显示内存消耗和GC活动的图表。如果你看到你的应用程序在很短的时间内流失了很多内存,你可能想看看你是否可以减少它。
visualvm
是一个超级强大,免费的Java工具,应该放在每个工具箱中,当你看到性能问题时,这是第一个去的地方。