Java Swing тяжёлый / медленный paintComponent - любой совет?

Я делаю скроллинг 2D-карты / плитки на основе игры. Каждая плитка (хранящаяся как плитка [21][11] - всего 231 плитка на карту) может содержать до 21 значения (хранится как int[3][7]). В полноэкранном режиме я вижу около 8 карт одновременно.

В среднем на каждую карту уходит около 0,03 секунды (определяется с помощью System.nanoTime). Проблема в том, что, как только на экране появляется более 1 карты, опрос событий Swing заметно замедляется.

Есть ли какое-то решение этого? Я не могу нарисовать карту один раз, чтобы сохранить ее как изображение, потому что она имеет прозрачность с участием движущихся актеров, поэтому она меняется слишком часто. Также я не думаю, что я могу вызвать поток в paintComponent, чтобы нарисовать карты без сбоев, но я не уверен.

1 ответ

Решение

мой Tiles не какой-либо тип JComponent они просто данные. Я называю их контейнером MapPane, который рисует все плитки в своем paintComponent,

Точно так же, JTable клетки просто данные, представленные внутри JComponent; Упомянутая здесь модель с наименьшим весом все еще применима: цель состоит в том, чтобы исключить любые попытки визуализации невидимых ячеек. Профиль и время работы с целью оптимизации рендеринга; некоторые подходы рассматриваются в KineticModel цитируется здесь.

BufferedImage это не нуждается в масштабировании лучше. Если вам нужно масштабировать, экспериментируйте с RenderingHints связанные с типом интерполяции. Если композиция слишком дорогая, постройте карты в фоновом режиме, используя SwingWorker; publish() их, как они становятся доступными и process() их на EDT, как показано здесь.

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