2016-10-04 10 views
0

Я пишу 2D-плитку на Java. Персонажи должны быть помещены на плитки в соответствии с логикой игры. Каждый символ связан с изображением, которое будет нарисовано на экране с использованием java.awt.Graphics2D. Однако на карте может быть более одного экземпляра каждого символа.Java загружает изображение в класс - самая эффективная практика?

Какова рекомендуемая практика хранения и доступа к изображениям персонажей?

Есть три возможных реализаций я мог думать:

  1. Наличия каждого символа назначенного приватные переменный типа java.awt.image.BufferedImage. Каждый раз, когда объект нужно нарисовать, изображение обращается с помощью геттера. Однако будет ли это иметь чрезмерное значение размера объекта?
  2. Наличие еще одной утилиты Класс для хранения всех изображений в статической переменной. Каждый раз, когда персонаж должен быть нарисован, изображение можно вызвать, передав id/name статическому методу getter в классе утилиты. Будет ли это более эффективным или будет довольно медленным, чем предыдущий метод?
  3. Просто загрузите изображение каждый раз, когда персонаж должен быть нарисован. Это спровоцировало бы ImageIO.read(new File(character.getImagePath()) каждый раз, когда персонаж должен быть нарисован. Может ли это быть самым быстрым?
+1

Ни в коем случае нельзя использовать опцию 3. Метод рисования обычно называется * несколько раз в секунду. * Чтение файла, который часто, даже с использованием кэша операционной системы, замедляет вашу игру до обхода. – VGR

+1

Используйте лист спрайта вместо отдельных изображений. – eldo

ответ

1

Я прочитал ряд статей о том, как оптимизировать игры, и я видел, что загрузка необходимых ресурсов с самого начала и их хранение для последующего использования очень важны. Некоторые из самых длинных операций находятся в коде ввода/вывода файлов. Существует даже вероятность того, что произойдет какое-то исключение. Например, в вашем третьем варианте, что произойдет, если ImageIO выбрасывает IOException? У вас не было бы изображения, и вам нужно было бы сделать что-то еще. Это может привести к тому, что игровой опыт пользователя будет искажен, если чтение изображения займет больше времени, чем ожидалось.

Вот пример фрагмента для предварительной загрузки ресурса (в вашем .jar):

// Imports and other stuff... 

// Parameter flocation: resource location 
private BufferedImage preloadImage(String flocation){ 
    BufferedImage bufimg = null; 
    System.out.println("Attempting to load image: '" + flocation + "'"); 

    try { 
     bufimg = ImageIO.read(this.getClass().getResourceAsStream(flocation)); 
    } catch(IOException e){ 
     System.err.println(
       "An error occurred while attempting to load '" + flocation + "'"); 

     return null; 
    } 

    // Now store this somewhere safe! 
    return bufimg; 
} 

Для вашего 1-го и 2-го вариантов, там действительно не так много разницы, если вы об этом думаете. Первый просто добавляет поле каждому персонажу, а другой управляет всеми символами для вас. Лично я предпочитаю первый вариант, потому что он уменьшает беспорядок кода, увеличивая читаемость. Конечно, вы можете решить группировать свой код на основе тем, поэтому второй вариант полностью прекрасен.