2009-08-10 4 views
3

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

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

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

ответ

2

Свинг объединяет в себе перекраски: см. "Painting in AWT and Swing" на веб-сайте Sun. Если вы планируете несколько повторов в быстрой последовательности, они объединяются в один вызов для рисования сразу().

1

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

2

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

0

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

По существу я сделать следующее:

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

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

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

0

Я слышал, что вы говорите. Вы действительно можете перекрасить только участок области. В «Выполнение пользовательских примеров рисования» на веб-сайте 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); 
     } 

Этот код является объектом авторского права (см here for full code and copyright notice)

См here for further example listings

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

 Смежные вопросы

  • Нет связанных вопросов^_^