Java 为什么画得这么慢?

Java 为什么画得这么慢?,java,performance,animation,draw,Java,Performance,Animation,Draw,我正在尝试开发一个简单的2D游戏,对于动画,我使用定时器和定时器任务 但只有当我为24000 X 1600大小和30MB png文件的背景图像调用repaint时,它才绘制得如此缓慢。当我叫其他的重新油漆时,一切都很好 是因为我画得太大了吗 我尝试了24000 X 1600,130KB的png文件,但它仍然绘制得很慢。。有什么问题吗 啊,还有,我试着在容器内的JPanel上画它 这是我的密码 public void setIcon() { try { imgBackgro

我正在尝试开发一个简单的2D游戏,对于动画,我使用定时器和定时器任务

但只有当我为24000 X 1600大小和30MB png文件的背景图像调用repaint时,它才绘制得如此缓慢。当我叫其他的重新油漆时,一切都很好

是因为我画得太大了吗

我尝试了24000 X 1600,130KB的png文件,但它仍然绘制得很慢。。有什么问题吗

啊,还有,我试着在容器内的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();
    }
};
public void setIcon(){
试一试{
imgBackground=ImageIO.read(新文件(“./Images/Background/Background_1.png”);
imgBackground=转换为RGB(imgBackground);
}捕获(例外e){
System.out.println(例如toString());
}
}
公共静态BuffereImage转换器为RGB(BuffereImage图像){
BuffereImage newImage=新的BuffereImage(image.getWidth(),image.getHeight(),buffereImage.TYPE_INT_ARGB);
Graphics2D g=newImage.createGraphics();
g、 drawImage(image,0,0,null);
g、 处置();
返回新图像;
}
公共无效退税地(){
如果(背景X>=-25900){
buff.drawImage(imgBackground,backgroundX,0,null);
如果(游戏状态){
如果(右键){
背景x-=3;
}否则{
背景x-=2;
}
}
}
如果(背景2x>=-25900){
buff.drawImage(imgBackground,background2X,0,null);
如果(游戏状态){
如果(右键){
背景2x-=3;
}否则{
背景2x-=2;
}
}
}

如果((backgroundX您的图像是huuuge。假设绘制一个像素需要1纳秒。那么绘制整个图像需要38.4毫秒

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


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

哈哈哈……这不是输入错误。我实际上一直在尝试使用24000 X 1600大小。但我认为我的编码有问题,因为我尝试使用2400X1400,但绘制速度也非常慢。请阅读