Java перерисовывается медленно при определенных условиях - PullRequest
3 голосов
/ 26 марта 2010

Я делаю простую сетку, каждый квадрат которой подсвечивается курсором: альтернативный текст http://img168.imageshack.us/img168/203/screenshottest.png

Это пара JPanels, mapgrid и overlay внутри JLayeredPane, с mapgrid внизу. Mapgrid просто рисует при инициализации сетки, его метод рисования выглядит так:

public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);

for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            g2d.setColor(new Color(128, 128, 128, 255));
            g2d.drawRect(tileSize * j, i * tileSize, tileSize, tileSize);

        }
    }

В наложении JPanel происходит выделение, это то, что перерисовывается при перемещении мыши:

    public void paintComponent(Graphics g) {

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);


    g2d.setColor(new Color(255, 255, 128, 255));
    g2d.drawRect((pointerX/tileSize)*tileSize,(pointerY/ tileSize)*tileSize, tileSize, tileSize);

}

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

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

Есть ли лучший способ сделать это? Почему это происходит?

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

Вместо drawRect вы могли бы drawLine. Вы должны получить тот же визуальный результат, но я думаю, что он будет намного быстрее.

Кроме того, если фон всегда один и тот же, я бы порекомендовал рисовать буферизованное изображение при инициализации (или при изменении размера кадра), а затем просто рисовать это изображение. Это должно ускорить рисование.

1 голос
/ 26 марта 2010

Я заметил, что хотя базовый слой (mapgrid) НЕ перекрашивается при перемещении мыши, только прозрачный оверлейный слой, производительность отсутствует.

Это не делаетсмысл для меня.Так как ваша оверлейная панель только делает drawRect (...) для сетки, над которой в данный момент находится мышь, как сбрасывается предыдущая сетка?Я полагаю, что когда вы перерисовываете свою панель наложения, она непрозрачна, чтобы сетка карты сначала перерисовывала всю сетку, прежде чем перерисовывать сетку на панели наложения.

Есть ли лучший способсделать это?

Следите за последней нарисованной сеткой.Затем вы можете вызвать перекрашивание (Rectangle), чтобы перекрашивать только эту сетку на панели сетки карты.Затем вы также можете вызвать перерисовку (Прямоугольник) на панели наложения, чтобы перерисовать сетку на панели наложения.

Если вам нужна дополнительная помощь, опубликуйте свой SSCCE , который демонстрирует проблему.

1 голос
/ 26 марта 2010

Если все ваши Mapgrid одного цвета, вытяните setColor из цикла. Прямо сейчас каждый вызов рисования создает новые объекты Color.

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