当前位置: 首页 > 知识库问答 >
问题:

java-PaintComponent导致我的程序变慢

濮阳祯
2023-03-14

不知道如何解释这一个,但图像从来没有保存在对象中。getImage()函数在另一个类调用映像时创建并返回映像。

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

当显示板JPanel时,对象只被绘制一次

//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
                );
            }
        }
    }
}
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 + "/";
}
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个答案

甘学潞
2023-03-14

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

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

不要用画法做IO。这会减慢画的速度。

应该在类的构造函数中读取图像。那么绘画方法就可以从您的图像缓存中访问图像。

 类似资料:
  • 我在java应用程序中使用log4j2。就日志功能而言,一切都很好,但是在启动应用程序时,它似乎会导致非常明显的延迟。 我已经把代码剥离到基本的 如果不包括log4j2,那么当我运行应用程序时,控制台中就会出现“TEST”,包括构建路径中的log4j2代码和文件夹,这会导致测试出现时间延迟40-50秒。 log4j2.xml中设置为跟踪的标志 谢谢你的帮助,亚历克西斯

  • 问题内容: 我已经下载了两个罐子。我想导入其中一些包含的类。我该怎么做呢? 这是我的算法课程。我尝试按照以下网站上的说明进行操作,但均无济于事。 http://algs4.cs.princeton.edu/code/ 有一个OSX安装程序(我正在运行Mountain Lion),据说它会将jar添加到您的类路径中。不幸的是,它也安装了Java博士。我宁愿只使用Sublime和Terminal。我以

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp

  • 问题内容: 正如此处详细说明并在此处确认的那样,Oracle在通过JDBC查询数据时返回的默认行数为10。我正在开发一个必须从我们的数据库中读取和比较大量数据的应用程序。我以为,如果我们增加到1000左右,那么我们的应用程序性能肯定会更快。事实证明,它的 执行速度较慢 ,大约 降低 了20%。 然后,我们决定将数字从10逐渐增加,并观察其性能。通过将其设置在100到200之间,我们已经看到大约10

  • 这里是Android开发者新手。我在MainActivity中使用recyclerview,应用程序不断崩溃。 任何帮助都将受到赞赏! 编辑:对不起,我是新来的。我已经附加了Logcat。和其他xml文件。谢谢 这是我的代码: 列出你的布局。xml: activity_main.xml: } ProductAdapter。java类: } Logcat: 致命异常:主进程:e.wolverine2

  • 我很难让Autowired注释在我的spring boot应用程序中工作。 我也无法在包之外运行main方法。有什么建议吗? UserService类 UserRepository类