Оптимизация графики Java - PullRequest
2 голосов
/ 30 июня 2010

У меня есть пользовательский интерфейс, нарисованный для моего Java-приложения.Прямо сейчас я рисую весь интерфейс с нуля.Я точно знаю, что некоторые части интерфейса статичны.Я знаю, что мог бы сохранить эти статические части в изображении, но приведет ли это к повышению производительности (поскольку даже изображение должно быть нарисовано в каждом кадре)?

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

Заранее спасибо, Алан

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

Здесь можно сделать две основные оптимизации.Во-первых, убедитесь, что когда вы вызываете перерисовку вашего пользовательского интерфейса, обычно это делается вызовом repaint, вы должны вызывать версию repaint, где вы указываете измененный прямоугольник.Сделайте прямоугольник достаточно большим, чтобы охватить фактически измененные части, а не статические части.Чтобы это было эффективным, вы также должны обратить внимание на clipRect в объекте Graphics2D, который вы передаете в paint ().Это используется системой, чтобы точно сказать, что нужно перекрасить, в вышеупомянутом случае обычно это прямоугольник, который вы передали перекрасить.Не рисуйте ничего, что лежит полностью за пределами этого прямоугольника.

Вы также можете получить значительные улучшения производительности, кэшируя статические части вашего интерфейса в изображении.Написание изображения, безусловно, самый быстрый способ вывести вещи на экран.Мои измерения показывают, что маленькие изображения быстрее, чем даже несколько простых примитивов для рисования.Однако вы должны убедиться, что характеристики изображения соответствуют экрану, используя createCompatibleImage ().

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

1 голос
/ 30 июня 2010

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

В своем коде (в основном, в играх и симулах Swing) я обычно стараюсь следовать следующим правилам:

  1. Предварительная подготовка статических изображений (например, текстуры BufferedImage для элементов пользовательского интерфейса)
  2. Переопределить метод paintComponent () для каждого элемента пользовательского интерфейса отдельно для рисования
  3. Вызывать метод repaint () любого данного элемента пользовательского интерфейса можно только в том случае, если я знаю, что что-то изменилось
  4. Вызовите repaint () в цикле на основе таймера для анимации, но вызовите его только в той части пользовательского интерфейса, которая анимируется (например, во вложенном JPanel)

Этот подход, кажется, работает и работает довольно хорошо (хотя я хотел бы получить комментарии, если есть способы улучшить его !!)

1 голос
/ 30 июня 2010

если некоторые части экрана полностью статичны, то никогда не перерисовывайте эту часть.Не выполняйте очистку в полноэкранном режиме или окне, просто очистите часть экрана / окна, которая постоянно меняется.

Таким образом, вы не будете без необходимости перерисовывать статическое изображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...