3

我正在做一个简单的网格,每个正方形都由光标突出显示: 替代文字

它们是 JLayeredPane 中的几个 JPanel、mapgrid 和覆盖,底部带有 mapgrid。Mapgrid 只是在初始化网格时绘制,它的绘制方法是:

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            g2d.setColor(new Color(128, 128, 128, 255));
            g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize);

        }
    }

在覆盖 JPanel 中,突出显示发生在,这是移动鼠标时重新绘制的内容:

    public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);


    g2d.setColor(new Color(255, 255, 128, 255));
    g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize);

}

我注意到,即使在鼠标移动时没有重新绘制基础层(mapgrid),只是透明覆盖层,性能也有所欠缺。如果我给覆盖 JPanel 一个背景,它的方式会更快。如果我删除 mapgrid Antialiasing,它也会更快一些。

我不知道为什么为覆盖层提供背景(从而隐藏地图网格)或在地图网格中禁用抗锯齿会导致更好的性能。

有一个更好的方法吗?为什么会这样?

4

3 回答 3

2

而不是drawRect你可以drawLine。你应该得到相同的视觉结果,但我认为它会快得多。

此外,如果背景始终相同,我建议在初始化时(或在调整框架大小时)绘制到缓冲图像,然后只绘制该图像。那应该加快绘图速度。

于 2010-03-26T02:23:29.580 回答
1

如果您的所有 Mapgrid 都是相同的颜色,请将 setColor 拉出循环。现在每个对绘画的调用都在创建 w*h 新的 Color 对象。

于 2010-03-26T03:42:57.980 回答
1

我注意到,即使在鼠标移动时没有重新绘制基础层(mapgrid),只是透明覆盖层,性能也有所欠缺。

这对我来说没有意义。由于您的覆盖面板仅对鼠标当前所在的网格执行 drawRect(...) ,因此先前的网格如何重置?我猜当你重新绘制覆盖面板时它不是不透明的,在你重新绘制覆盖面板上的网格之前,mapgrid 必须先重新绘制整个网格。

有一个更好的方法吗?

跟踪最后绘制的网格。然后您可以调用 repaint(Rectangle) 仅在地图网格面板上重新绘制该网格。然后,您还可以在覆盖面板上调用 repaint(Rectangle) 以在覆盖面板上重绘网格。

如果您需要更多帮助,请发布说明问题的SSCCE 。

于 2010-03-26T04:15:24.533 回答