Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java重绘在某些情况下速度较慢_Java_Performance_Repaint - Fatal编程技术网

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

Java重绘在某些情况下速度较慢,java,performance,repaint,Java,Performance,Repaint,我正在做一个简单的网格,每个正方形都由光标高亮显示: 它们是一对JPanel、mapgrid和覆盖层,位于JLayeredPane内,mapgrid位于底部。Mapgrid仅在网格上绘制,其绘制方法为: public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints

我正在做一个简单的网格,每个正方形都由光标高亮显示:

它们是一对JPanel、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);

        }
    }
我注意到,即使在鼠标移动时基础层(mapgrid)没有重新绘制,只是透明覆盖层,性能仍然不足。如果我给叠加JPanel一个背景,它的速度会更快。如果删除mapgrid抗锯齿,速度也会快一点

我不知道为什么为叠加层提供背景(从而隐藏mapgrid)或禁用mapgrid中的抗锯齿会带来更好的性能


有更好的方法吗?为什么会发生这种情况?

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


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

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

我注意到,即使基地 图层(mapgrid)在 鼠标移动,只是透明的 覆盖层,性能良好 缺乏

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

有更好的方法吗

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


如果您需要更多帮助,请发布您的帖子,以说明问题所在

为什么我要改变绘制网格的方式?底层也被重新绘制,即使我没有指定这样做?@Gabriel整个窗口都被缓冲。如果您重新绘制了其中的一个部分,那么对该部分有贡献的所有内容都需要重新绘制。没有每个组件缓冲(默认情况下)。
    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);

}