Pixels Array Too CPU Intensive

Я некоторое время работал над Java 2D-игрой. Это растровая графическая система с массивом пикселей (целых чисел).

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

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

Тем не менее, я обнаружил, что это сильно загружает процессор. Мой монитор активности говорит, что приложение использует более 100% моего процессора. Это очевидно потому, что я обновляю массив пикселей (76k целых чисел) каждое обновление (60 раз в секунду).

Я выбрал эту технику в образовательных целях. Это личный проект, и я просто хотел получить представление о графике Java. Я ни в коем случае не женат на этой технике рендеринга.

Мой вопрос состоит из трех взаимосвязанных частей...

  1. Очевидно, есть лучший способ сделать это. Какие библиотеки / фреймворки сделали бы это лучше?
  2. Будут ли эти библиотеки по сути делать то же самое (проходить через пиксели), просто более эффективным способом?
  3. Есть ли способ, которым я могу оптимизировать эту технику без использования внешних инструментов, или это просто не стоит?

1 ответ

Решение

OpenGL чаще всего ассоциируется с приложениями 3D-графики, но также может использоваться для приложений 2D-графики. Используя ортогональную проекцию и текстурированные квадраты, чтобы заменить спрайты и фоновые изображения, вы можете создать графику и интерфейс для игры вообще без 3D-элементов, несмотря на то, что рисование выполняется, в некотором смысле, в 3D.

У меня нет опыта использования OpenGL в Java. Однако я знаю, что это возможно, используя библиотеку LWJGL и, возможно, другие. Вы должны проверить это, если хотите значительно улучшить производительность графики.

Чтобы ответить на ваш второй вопрос, OpenGL в этом приложении на самом деле работает совсем не так, как ваш подход, используя те же методы, которые он использовал бы для рисования текстурированных многоугольников в 3D, а не просто передачи блочных изображений в кадровый буфер, хотя к пиксельным данным можно обращаться и манипулировать ими.

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

пример 2D графики с использованием OpenGL

Другие вопросы по тегам