2017-01-21 2 views
0

J'essaie de développer un jeu 2D simple et pour l'animation, j'utilise Timer et TimerTask.Pourquoi dessine-t-il si lentement?

Mais il dessine si lent que lorsque j'appelle repeindre pour l'image de fond qui est de taille 24000 X 1600 et 30 Mo de fichier png. Et c'était bien quand j'ai appelé d'autres repaints.

Est-ce parce que je dessine une trop grande image?

J'ai essayé avec 24000 X 1600, 130KB png fichier mais il a toujours dessiné si lent .. Quel est le problème ??

Ah, et aussi, j'essaie de le dessiner sur le JPanel qui est dans Container.

Voici mon code

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(); 
    } 
}; 
+0

Veuillez lire https://stackoverflow.com/help/mcve. –

Répondre

0

Votre image est huuuge. Disons que dessiner un pixel prend 1 nanoseconde. Ensuite, le dessin de l'image entière prend 38,4 millisecondes.

Vous devez vraiment vous assurer que l'image entière n'est pas dessinée, mais restreindre le dessin aux parties réellement modifiées.

Lorsque j'ai vu le 24000, j'ai pensé c'est une faute de frappe. Ça doit être une faute de frappe. Personne ne produit des images aussi grandes et s'attend à ce qu'elles soient traitées efficacement.

+0

Hahahah .... ce n'était pas une faute de frappe. J'ai essayé avec la taille 24000 X 1600. Mais je pense que mon codage est problématique, car j'ai essayé avec le 2400X1400 mais il était aussi très lent. – AvrilLavigneLikesJava