有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用paintcomponent方法绘制大量图像非常耗时

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幅图像。我还有另一个对象,当我按下向右箭头键时,它会一直向右移动,当按下向左箭头键时,它会一直向左移动,依此类推(使用keypressed事件)。但每次调用“paint component”时,其他可移动对象的移动都会变得非常缓慢。我怎样才能跑得平稳呢。我怎样才能阻止砖块每次被粉刷呢


共 (2) 个答案

  1. # 1 楼答案

    通过预先加载图像,可以大大提高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中绘制图像

  2. # 2 楼答案

    假设您的代码摘录来自paintComponent()方法,那么您在那里做的工作远远超出了您应该做的。在每次更新时,您的paintComponent()必须从磁盘读取每个文件(I/O非常昂贵),并从其内容(不一定便宜)构造一个BufferedImage。然后它会丢弃图像,图像大小可能至少有几十kB,这最终会给GC带来压力

    除非您有理由期望在程序运行时修改图像文件(甚至可能修改它们),否则您可以通过每次读取所有文件一次,并保留BufferedImage对象供paintComponent()重复使用,从而显著提高性能。如果图像的相对位置没有改变,那么你甚至可以考虑从它们的内容构造一个大的图像,并且让^ {CD1}}画成这样。p>