문제

청취자로부터 여러 번 repaint를 호출하고 있지만 페인트 기능을 디자인한 방식에서는 repaint가 한 번만 필요합니다.마우스 모션 리스너에 연결되었기 때문에 여러 번의 다시 그리기를 생성했습니다.

특정 구성요소에 대해 보류 중인 모든 다시 그리기를 취소하는 방법이 있습니까?다시 그리기를 무시할 수는 없습니다. 일부는 프레임 크기를 조정하거나 최소화에서 복원할 때와 같이 유효하기 때문입니다.

내가 왜 신경쓰나요?내 페인트 코드가 매우 무거워서 매우 높은 FPS에서 전체 다시 그리기를 수행할 수 없기 때문입니다.

도움이 되었습니까?

해결책

Swing은 다시 그리기를 결합합니다.보다 "AWT 및 Swing으로 페인팅" 썬 홈페이지에서빠르게 연속해서 여러 번의 다시 그리기를 예약하면 이러한 작업은 단일의 PaintImmediately() 호출로 결합됩니다.

다른 팁

빈번한 리 페인트 요청이 자동으로 붕괴됩니다. 이것을 최적화하는 가장 좋은 방법은 모든 것을 다시 칠하는 것이 아니라 특정 영역의 좌표로 다시 Repaint를 호출하는 것입니다. 이것은 실제로 변경된 영역 만 다시 칠한 것을 의미합니다.

내 이해는 그게됩니다 repaint() 리 페인트 큐에 구성 요소의 영역을 추가하여 리페이트를 예약합니다. 구성 요소에 이미 리 페인트가 요청 된 경우, 새로운 리 페인트 지역은 이전에 요청 된 지역과 연합 될 것입니다. 이벤트 대기열의 다른 모든 이벤트가 처리 될 때까지 다시 Refaint가 실행되지 않습니다. 따라서 추가 페인트는 큰 차이를 만들지 않을 수 있습니다. 즉, 그림 코드는 한 번만 실행됩니다. 보다 jcomponent.repaint 그리고 RefaintManager.adddirtygrion.

나는 해킹 JFreeChart가 페인트 칠을 많이 할 때 페인트 칠을 결정하는 방법을 개선하기 위해 함께 비슷한 것입니다.

본질적으로 나는 다음을 수행한다.

  • a ScheduledExecutorService 수업의 필드로
  • 첫 번째 리 페인트 요청을 받고 submit EDT에서 50ms에서 EDT에서 실행하는 것은 유언 집행 인에게 미래를 되찾아줍니다.
  • 두 번째 요청을 받으십시오 - 이전 리페이트가 완료되었는지 확인하려면 테스트 (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에 대해 비슷한 문제를 겪고 있지만 현재 내 코드가 좋지 않았기 때문일 수 있습니다! 지난 몇 달 동안 많은 것을 배웠기 때문에 이제 코드를 더 효율적으로 만들 수 있습니다. 2 명 이상의 "사람들"이 내 그래픽을 늦출 때 FPS 문제를 극복 할 수 있기를 바랍니다. Hummmm ... 나는 다른 코드가 아닌 내 코드에서 동일한 섹션에 대한 위 코드 만 구현했지만 반드시 시도해보십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top