2015-07-09 1 views
0

Я хотел бы запрограммировать 2D-движок игры. Проблема у меня (я не использую opengl и т. Д., Так что я делаю с процессором), что я получаю только 7fps через graphics.drawImage(); Есть ли у вас предложения ускорить это или какие-либо альтернативы?java.awt.Graphics -> graphics.drawImage слишком медленный, что не так?

image = new BufferedImage(gc.getWidth(), gc.getHeight(), BufferedImage.TYPE_4BYTE_ABGR); 
canvas.createBufferStrategy(1); 
bs = canvas.getBufferStrategy(); 
g = bs.getDrawGraphics(); 
g.drawImage(image, 0, 0, canvas.getWidth(), canvas.getHeight(), null); 

Мой рендерер должен просто цвет рамки (ширина 320 высота 240 пикселей) голубого цвета, и он делает, но только при максимуме 8fps. Renderer:

private int width, height; 
private byte[] pixels; 

public Renderer(GameContainer gc){ 
    width = gc.getWidth(); 
    height = gc.getHeight(); 
    pixels = ((DataBufferByte)gc.getWindow().getImage().getRaster().getDataBuffer()).getData(); 
} 

public void clear(){ 
    for(int x = 0; x < width; x++){ 
     for(int y = 0; y < height; y++){ 
      int index = (x + y * width) * 4; 
      pixels[index] = (byte)255; 
      pixels[index+1] = (byte)255; 
      pixels[index+2] = (byte)255; 
      pixels[index+3] = 0; 
     } 
    } 
} 
+0

8fps для очистки 320x240 слишком медленно. Обычно я использую VCL Bitmap ScanLine [] для SW renderig для двух и трехмерных изображений. Я получил скорость намного лучше, чем 7fps. попробуйте разные gfx api или язык. Почему вы отметили [OpenGL], когда вы его не используете? см. [Отобразить массив цветов в C] (http://stackoverflow.com/a/21699076/2521214) для некоторых идей – Spektre

ответ

1

Я не совсем уверен, как оптимизировать ваш текущий пример (но с использованием буфера данных в clear действительно создать из ускорения только с помощью Graphics.fillRect?), Но я могу дать вам некоторые общие Java2D Подсказок ,

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

private static final GraphicsConfiguration GFX_CONFIG = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration(); 

public static BufferedImage toCompatibleImage(final BufferedImage image) { 
    /* 
    * if image is already compatible and optimized for current system settings, simply return it 
    */ 
    if (image.getColorModel().equals(GFX_CONFIG.getColorModel())) { 
     return image; 
    } 

    // image is not optimized, so create a new image that is 
    final BufferedImage new_image = GFX_CONFIG.createCompatibleImage(image.getWidth(), image.getHeight(), image.getTransparency()); 

    // get the graphics context of the new image to draw the old image on 
    final Graphics2D g2d = (Graphics2D) new_image.getGraphics(); 

    // actually draw the image and dispose of context no longer needed 
    g2d.drawImage(image, 0, 0, null); 
    g2d.dispose(); 

    // return the new optimized image 
    return new_image; 
} 

Кроме того, обычно хорошая практика распоряжаться графических объектов, когда вы закончите с ними (это может помочь, если вы создаете их в тугой петлей).

Вот некоторые другие вопросы, которые дают несколько советов:

Java2D Performance Issues

Java 2D Drawing Optimal Performance

1

Я знаю, что я немного опоздал на вечеринку, но для тех, кто смотрит на это в будущем:

Не пытайтесь обрабатывать свои изображения в виде массивов!

Если вы хотите, чтобы цвет всего экрана или изображение, используя холст, получить изображение объекта, как описано выше, и использовать прямоугольник, чтобы заполнить экран, как это:

g.setColor(new Color(REDVALUE,GREENVALUE,BLUEVALUE); 
g.fillRect(0,0,canvas.getWidth(),canvas.getHeight()); 

Если текущий класс расширяет Canvas то вы можете использовать, очевидно:

getWidth() and getHeight() 

Вместо:

canvas.getWidth() and canvas.getHeight() 

Если у вас возникли проблемы с пониманием того, как работает объект Graphics, вы можете сначала взглянуть на this.

Если вы хотите сделать более сложным Обработка изображений this может вам помочь.

EDIT: рисование больших изображений каким-то образом (???) медленнее, чем рисование небольших изображений для заполнения той же области.