代码之家  ›  专栏  ›  技术社区  ›  YianniW

Java-paintComponent导致我的程序变慢

  •  0
  • YianniW  · 技术社区  · 6 年前

    所以我正在做一个由两个网格组成的游戏。每个网格都是一个JPanel,我在网格中的每个空间上(可能)绘制一个对象。我发现了 绘画 对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。

    详细信息:

    • 每个网格为6x12,因此可能有144个对象(极端情况)加上背景将立即绘制到整个框架上。

    • 绘制的每个对象都是一个16x16图像文件,它会根据大小进行缩放,不知道这是否相关,但我已经为对象类提供了构造函数,以防它可能与初始化图像有关?

    • 不知道如何解释这一点,但图像从未保存在对象中。函数的作用是:当图像被另一个类调用时,创建并返回该图像。

    • 目前,该项目已设置为在游戏开始时初始化对象数组。直到切换到板JPanel并绘制对象,它才会减速。

    • 当显示Board JPanel时,对象仅绘制一次

    Board类的paintComponent:

    //public Board extends JPanel
    
    // boardManager holds an array of the objects
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for(int i = 0; i < 12; i++) {
            for(int j = 0; j < 6; j++) {
                if(boardManager.getVisibility(i, j)) {
                    g.drawImage(
                        boardManager.getImage(i, j),
                        boardManager.getX(i, j),
                        boardManager.getY(i, j),
                        this
                    );
                }
            }
        }
    }
    

    从BoardManager类获取图像(int,int):

    public Image getImage(int x, int y) {
        return grid[x][y].getImage();
    }
    

    对象类的构造函数:

    private int current;
    
    public Object(Game frame, int x, int y, String c, Boolean vis) {
        this.frame = frame;
        xPos = x;
        yPos = y;
        color = c;
        visible = vis;
        current = 01;
    
        imgPath = "/game/img/" + color + "/";
    }
    

    对象类中的getImage():

    public Image getImage() {
        try {
            BufferedImage img = ImageIO.read(this.getClass().getResource(imgPath + current + ".png"));
            Image scaledImg = img.getScaledInstance(16 * frame.scale, 16 * frame.scale, Image.SCALE_FAST);
            return scaledImg;
        }
        catch(IOException | IllegalArgumentException ex) {
            System.err.println("Error: file not found " + imgPath + current + ".png");
        }
        return null;
    }
    

    我主要担心的是,随着棋盘上的人越来越多,游戏的进程将开始放缓,这可能是未来的问题。目前这种滞后并不严重,但我只能测试到目前为止只有一块板被填满时会发生什么。我相信,随着两个董事会都被填满,情况会变得更糟。

    我的代码是如何设置的,有什么问题吗?还是有更有效的方法来解决这个问题?

    1 回复  |  直到 6 年前
        1
  •  1
  •   camickr    6 年前

    据我所知,paintComponent()方法最终调用:

    BufferedImage img = ImageIO.read(this.getClass().getResource(imgPath + current + ".png"));
    

    不要在绘制方法中执行IO。这会减慢绘画速度。

    这些图像应该在类的构造函数中读取。然后,绘制方法可以仅从图像缓存访问图像。

    此外,在读入图像时,应缩放图像一次。