为什么这么慢?

时间:2017-01-21 08:15:41

标签: java performance animation draw

我正在尝试开发一个简单的2D游戏,并且为了动画,我正在使用Timer和TimerTask。

但是只有当我为24000 X 1600大小和30MB png文件的背景图像调用重绘时,它才会变得如此缓慢。当我打电话给其他重拍时,它很好。

是因为我画得太大了吗?

我试过24000 X 1600,130KB的png文件,但它仍然画得那么慢..有什么问题?

啊,而且,我正试图在Container内的JPanel上绘制它。

这是我的代码

public void setIcon() {
    try {
        imgBackground = ImageIO.read(new File("./Images/Background/Background_1.png"));
        imgBackground = convertToARGB(imgBackground);
    } catch (Exception e) {
        System.out.println(e.toString());
    }
}

public static BufferedImage convertToARGB(BufferedImage image) {
    BufferedImage newImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = newImage.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();
    return newImage;
}

public void drawBackground() {
    if (backgroundX >= -25900) {
        buffg.drawImage(imgBackground, backgroundX, 0, null);
        if (gameState) {
            if (keyRight) {
                backgroundX -= 3;
            } else {
                backgroundX -= 2;
            }
        }
    }
    if (background2X >= -25900) {
        buffg.drawImage(imgBackground, background2X, 0, null);
        if (gameState) {
            if (keyRight) {
                background2X -= 3;
            } else {
                background2X -= 2;
            }
        }
    }
    if ((backgroundX <= -22000) && (background2X <= -25900))
        background2X = fWidth;
    if ((background2X <= -22000) && (backgroundX <= -25900))
        backgroundX = fWidth;
}

public void start(){
    Timer timer = new Timer();
    timer.schedule(timerTask, 50, 10);
}

TimerTask timerTask = new TimerTask() {

    @Override
    public void run() {
        playerMoveProcess();
        getContentPane().repaint();
        getContentPane().revalidate();
    }
};

1 个答案:

答案 0 :(得分:0)

你的形象是huuuge。假设绘制一个像素需要1纳秒。然后绘制整个图像需要38.4毫秒。

您应该确保不是绘制整个图像,而是将绘图限制为实际更改的那些部分。

当我第一次看到24000时,我认为这是一个错字。一定是拼写错误。没有人会生成如此大的图像,并期望它们得到有效处理。