编程语言
首页 > 编程语言> > 在某些情况下,Java重绘速度很慢

在某些情况下,Java重绘速度很慢

作者:互联网

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

它们是几个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.您应该获得相同的视觉效果,但是我认为它将更快.

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

标签:repaint,performance,java
来源: https://codeday.me/bug/20191106/2000675.html