2013-12-25 3 views
0

я взглянуть на код Notch от Ludum осмелится (minicraft) и я заметил, что он использует:BufferedImage производительность

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

Так я сделал простую тестовую программу, и я заметил, что мой Perfomance понижает на много, когда по сравнению с методом, который ранее использовался. С помощью этого метода, просто рисуя полностью белый экран, я получаю 800 кадров в секунду, и когда я рисую тестовое изображение, я получаю больше 1200, что кажется немного странным. Даже если я не объявлю ничего на pixels[] и просто оставлю по умолчанию, он по-прежнему составляет 800 кадров в секунду. Интересно, может ли кто-нибудь объяснить мне причину этого. Это тестовый код я написал, и я использовал Fraps, чтобы получить мой фпс:

public class Test extends Canvas implements Runnable{ 

private static final long serialVersionUID = 1L; 

private boolean running = false; 

public final int HEIGHT = 300; 
public final int WIDTH = 360; 
private final int SCALE = 3; 

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); 
private BufferedImage testImage; 
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); 

JFrame frame; 
public Test(){ 
    Dimension size = new Dimension(WIDTH*SCALE, HEIGHT*SCALE); 
    frame = new JFrame(); 
    this.frame.setResizable(false); 
    this.setPreferredSize(size); 
    this.setMaximumSize(size); 
    this.setMinimumSize(size); 
    this.frame.add(this); 
    this.frame.pack(); 
    this.frame.setLocationRelativeTo(null); 
    this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setFocusable(true); 
    this.frame.setVisible(true); 

    try { 
     testImage = ImageIO.read(new File("res/test.jpg")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    for(int i = 0; i < pixels.length; i++){ 
    pixels[i] = 0xffffff; 
    } 
    running = true; 
} 

public void run() { 
    while(running){ 
     render(); 
    } 
} 

private void render() { 
    BufferStrategy bs = getBufferStrategy(); 
    if(bs == null){ 
     createBufferStrategy(3); 
     return; 
    } 

    Graphics g = bs.getDrawGraphics(); 
    //Draw stuff 
    g.setColor(Color.BLACK); 
    g.fillRect(0, 0, getWidth(), getHeight()); 
    g.drawImage(testImage, 0, 0, getWidth(), getHeight(), null); 
    g.dispose(); 
    bs.show(); 
} 

public static void main(String args[]){ 
    Test test = new Test(); 
    test.run(); 
} 

}

Я просто заменить testImage на image. Спасибо всем и счастливым праздникам

Редактировать: Я заметил, что просто вызов int [] пикселей = ((DataBufferInt) image.getRaster(). GetDataBuffer()). GetData(); замедляет приложение множеством. Может кто-нибудь, пожалуйста, объясните мне, почему это так? мне нужно избавиться от пикселей или чего-то еще? спасибо

ответ

0

Насколько я знаю, BufferedImages рассматриваются как VolatileImages за кулисами. Это означает, что они получают огромное ускорение аппаратного ускорения. Это связано с тем, что изображение копируется прямо в память вашей видеокарты, что позволяет быстро рисовать.

В тот момент, когда вы хотите получить доступ к матрице пикселей, изображение будет помещено в вашу обычную оперативную память и будет доступно оттуда, что приведет к значительному замедлению.

Реально, если вы отключите все аппаратное ускорение в JVM, белое изображение будет нарисовано быстрее всего.

Если вы хотите эффективно обновить свой экран, примените setIgnoreRepaint (true) к вашему окну и нарисуйте только те части экрана, которые были изменены.

Смежные вопросы