我正在做一个简单的网格,每个正方形都用光标突出显示:
java - 在某些情况下,Java重绘速度很慢-LMLPHP

它们是几个JPanels,mapgrid和JLayeredPane内的叠加层,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,它的速度也会更快一些。

我不知道为什么给覆盖层一个背景(从而隐藏mapgrid)或在mapgrid中禁用抗锯齿会导致更好的性能。

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

最佳答案

您可以使用drawRect代替drawLine。您应该获得相同的视觉效果,但我认为它将更快。

另外,如果背景始终相同,我建议在初始化时(或调整帧大小时)绘制到缓冲的图像,然后再绘制该图像。这样可以加快绘图速度。

07-28 06:36