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, как показано здесь.