Вопрос

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

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

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

Это было полезно?

Решение

Swing объединит перекраски для вас:видишь "Рисование в AWT и Swing" на веб-сайте Sun.Если вы запланируете несколько перерисовок в быстрой последовательности, они будут объединены в один вызов paintImmediately().

Другие советы

Частые запросы на перекраску автоматически сворачиваются в один.Лучший способ оптимизировать это - не перерисовывать все целиком, а вызвать repaint с координатами определенной области.Это означает, что вы перекрашиваете только ту область, которая действительно изменилась.

Мое понимание таково, что repaint() просто запланируйте перерисовку, добавив область компонента в очередь перерисовки.Если перекраска компонента уже была запрошена, новая область перекраски будет просто объединена с ранее запрошенными регионами.Перерисовка фактически не выполняется до тех пор, пока не будут обработаны все остальные события в очереди событий.Таким образом, ваши дополнительные перекраски могут не иметь большого значения, т. е.ваш код рисования будет выполнен только один раз.Видишь JComponent.перекрасить и RepaintManager.Добавить dirtyregion.

У меня есть взломанный что-то подобное вместе, чтобы улучшить то, как JFreeChart решает рисовать, когда он делает много вызовов для перерисовки.

По сути, я делаю следующее:

  • Создать ScheduledExecutorService как поле в классе
  • Получите первый запрос на перекраску и и submit это к исполнителю, чтобы запустить EDT, скажем, через 50 мс, вернув будущее
  • Получите второй запрос - проверьте, завершилась ли предыдущая перерисовка (fut.isDone()) и если да, то запланировать следующую перекраску;в противном случае ничего не делайте.

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

Я делал аналогичные вещи для группирования количества звонков в fireDataTableChanged когда одновременно происходит множество изменений.

Я слышу, что ты говоришь.Вы действительно можете перекрасить только часть области.В разделе "Выполнение пользовательских примеров рисования" на веб-сайте Sun я нашел полезный пример, который показывает, как нарисовать перетаскиваемый прямоугольник, а затем перекрашивать эту область только при перемещении или отпускании мыши.

Вот соответствующий раздел кода...

public void mouseDragged(MouseEvent e) {
            updateSize(e);
        }

        public void mouseReleased(MouseEvent e) {
            updateSize(e);
        }

        /* 
         * Update the size of the current rectangle
         * and call repaint.  Because currentRect
         * always has the same origin, translate it
         * if the width or height is negative.
         * 
         * For efficiency (though
         * that isn't an issue for this program),
         * specify the painting region using arguments
         * to the repaint() call.
         * 
         */
        void updateSize(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            currentRect.setSize(x - currentRect.x,
                                y - currentRect.y);
            updateDrawableRect(getWidth(), getHeight());
            Rectangle totalRepaint = rectToDraw.union(previousRectDrawn);
            repaint(totalRepaint.x, totalRepaint.y,
                    totalRepaint.width, totalRepaint.height);
        }

Этот код защищен авторским правом (см. полный код и уведомление об авторских правах приведены здесь)

Видишь здесь приведены дополнительные примеры объявлений

По правде говоря, у меня аналогичная проблема с FPS, но это может быть связано с моим текущим плохим кодом!За последние несколько месяцев я так многому научился, что теперь могу сделать свой код более эффективным.Надеюсь, я смогу преодолеть проблему с FPS, когда более 2 "человек" замедляют мою графику!Хммм...Я реализовал приведенный выше код только для того же раздела в своем коде, а не для других, но обязательно попробуйте!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top