2013-10-10 2 views
0

Здравствуйте) Там был вопрос, можно ли ускорить код, как то, что находится ниже:Ускорение вывода изображений

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 

public class Game extends Canvas { 

    private static final long serialVersionUID = 1L; 

    private static final int WIDTH = 400; 
    private static final int HEIGHT = 400; 

    @Override 
    public void paint(Graphics g) { 

     super.paint(g); 

     int w = 20; 
     int h = 20; 
     int type = BufferedImage.TYPE_INT_ARGB; 

     BufferedImage image = new BufferedImage(w, h, type); 
     Graphics2D g2d = image.createGraphics(); 
     g2d.setColor(Color.GREEN); 
     g2d.fillRect(0, 0, w, h); 
     g2d.dispose(); 
     int MapWidth = image.getWidth(this); 
     int MapHeight = image.getHeight(this); 

     for (int s = MapWidth - MapWidth; s < MapWidth * 10; s++) { 
      for (int i = MapHeight - MapHeight; i < MapHeight * 10; i++) { 
       g.drawImage(image, s, i, (int) w, (int) h, this); 
      } 
     } 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(); 

       frame.setSize(WIDTH, HEIGHT); 
       frame.add(new Game()); 

       frame.setVisible(true); 
      } 
     }); 
    } 
} 

Он рисует картины так долго. Как это ускорится? Помогите пожалуйста)

И одна программа не может быть закрыта до нарисованного изображения. Необходимо ускорить их нанесения

+0

Вы понимаете: «MapWidth - MapWidth» будет всегда равен нулю :). – libik

ответ

1

Это медленно, потому что в вашем

for (int s = 0; s < MapWidth * 10; s++) { 
     for (int i = 0; i < MapHeight * 10; i++) { 
      g.drawImage(image, s, i, (int) w, (int) h, this); 
     } 
    } 

Для 400 * 400 MapWidth, MapHeight вы красите 4000 * 4000 объектов, поэтому вы рисуете 16 000 000 объектов, это должно быть медленным.

Если вы замените его с этим, это будет быстро, как ад :):

for (int s = 0; s < MapWidth * 10; s += w) { 
     for (int i = 0; i < MapHeight * 10; i += h) { 
      g.drawImage(image, s, i, (int) w, (int) h, this); 
     } 
    } 
0

Просто попробуйте ниже код

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 

public class Game extends Canvas { 

    private static final long serialVersionUID = 1L; 

    private static final int WIDTH = 400; 
    private static final int HEIGHT = 400; 

    @Override 
    public void paint(Graphics g) { 

     super.paint(g); 

     int w = 20; 
     int h = 20; 
     int type = BufferedImage.TYPE_INT_ARGB; 

     BufferedImage image = new BufferedImage(w, h, type); 
     Graphics2D g2d = image.createGraphics(); 
     g2d.setColor(Color.GREEN); 
     g2d.fillRect(0, 0, w, h); 
     g2d.dispose(); 
     int MapWidth = image.getWidth(this); 
     int MapHeight = image.getHeight(this); 

     for (int s = MapWidth - MapWidth; s < MapWidth * 10; s++) { 
      for (int i = MapHeight - MapHeight; i < MapHeight * 10; i=i+10) { 
       g.drawImage(image, s, i, (int) w, (int) h, this); 
      } 
     } 

    } 

    public static void main(String[] args) { 

     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       JFrame frame = new JFrame(); 

       frame.setSize(WIDTH, HEIGHT); 
       frame.add(new Game()); 

       frame.setVisible(true); 
      } 
     }); 
    } 
} 
Смежные вопросы