Swing JLayeredPane停止重新绘制所有图层



我正在尝试用 Swing 制作一个游戏,我需要制作一个棋盘上有玩家的棋盘,所以我使用了JLayeredPane.在第 0 层我画了棋盘,然后在第 1 层我画了球员。 这很好用,但问题是当我重新绘制第 1 层(例如更改给定玩家的位置)时,性能非常糟糕。我的假设是它再次重新粉刷背景板,这导致了问题。 代码如下:

JLayeredPane layeredPane = new JLayeredPane();
layeredPane.add(boardView, new Integer(0));
layeredPane.add(creepsView, new Integer(1));

creepsViewboardView覆盖 paint 方法,当蠕变状态发生变化时,它会调用creepsView.repaint()方法,但随后 JLayeredPane 调用boardview.paint(),我不明白为什么。我怎样才能避免它?(我不想重绘没有改变的东西)。

我想

这是因为它再次重新粉刷背景板。

我怀疑这是问题所在,因为绘制加载到内存中的图像非常有效。

它调用creepsView.repaint()方法,然后由JLayeredPane调用boardview.paint。

为了让您看到背景,这意味着包含播放器的面板必须是透明的。这意味着当您重新绘制播放器面板时,还必须重新绘制背景面板以确保没有绘画伪影。例如,必须将玩家从其旧位置移开并在新位置绘画。

您可以尝试通过仅绘制面板的受影响区域来使绘画更有效率。也就是说,您不会重新绘制整个玩家面板,而只是在旧位置和新位置重新绘制玩家。阅读有关自定义绘画的 Swing 教程中的部分,了解此方法的示例。moveSquare(...)方法显示了此方法的工作原理。

最新更新