首页 文章

在paintcomponent方法中绘制大量图像非常耗时

提问于
浏览 827
1
for (int i = 0; i < bricksList.size(); i++) {
 BufferedImage image;
 try {

            image = ImageIO.read(new File(bricksList.get(i).img));

            g.drawImage(image, bricksList.get(i).x, bricksList.get(i).y, null); 
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }

我试图使用paintComponent()方法绘制80个图像 . 我还有另一个对象,当我按下右箭头键,继续向右移动,当按下左箭头键时,它继续向左移动,依此类推(使用按键事件) . 但是每次调用paint组件时,其他可移动对象的移动变得非常慢 . 我怎样才能顺利运行 . 我怎样才能阻止砖块每次涂漆?

2 回答

  • 2

    您可以通过预先加载图像来大大加快printComponent方法的速度

    在你的构造函数中创建一个像BricksListImgs这样的列表

    Image BricksListImgs[];
    
    MyConstructor () {
      BricksListImgs = new BricksListImgs[bricksList.size()];
      for (int i = 0; i < bricksList.size(); i++) {
        BricksListImgs[i] = ImageIO.read(new File(bricksList.get(i).img));
      }
    }
    

    然后在paintComponent方法中从BriksListImgs中绘制图像

  • 1

    假设您的代码摘录来自您的 paintComponent() 方法,那么您在那里做的工作远比您应该做的要多得多 . 在每次更新时, paintComponent() 必须从磁盘读取每个文件(I / O非常昂贵),并从其内容构建 BufferedImage (不一定便宜) . 然后它只丢弃图像,这个图像看起来可能至少达到几十KB,最终会开始对GC施加压力 .

    除非你有理由期望在程序运行时修改图像文件(甚至可能会修改它们),你可以通过每次读取所有文件来显着提高性能,并保留 BufferedImage 对象由 paintComponent() 重复使用 . 如果图像的相对位置没有改变,那么你甚至可以考虑从它们的内容构建一个大图像,然后让它绘制 .

相关问题