在某些条件下,Java重绘速度很慢

时间:2010-03-26 02:15:33

标签: java performance repaint

我正在做一个简单的网格,每个方格都由光标突出显示: alt text http://img168.imageshack.us/img168/203/screenshottest.png

它们是JLayeredPane中的几个JPanel,mapgrid和overlay,底部是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中禁用抗锯齿功能会带来更好的性能。

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

如果所有的Mapgrid都是相同的颜色,请将setColor拉出循环。现在,每次调用paint都会创建新的Color对象。

答案 2 :(得分:1)

  

我注意到即使是基地   图层(mapgrid)不会重新绘制   鼠标移动,只是透明   覆盖层,性能是   缺乏。

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

  

有更好的方法吗?

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

如果您需要更多帮助,请发布展示问题的SSCCE