2012-12-20 1 views
1

자바 스윙에서 낙서 타입 앱을 개발 중입니다. 그것은 초보적인 단계에 있으며 여기에 표시됩니다.스윙 앱의 실행 취소 힙 오버플로

Scribble Board

나는 개까지 마지막 그려 스트로크를 실행 취소 실행 취소 기능을 구현했습니다. 실행 취소 기능은 최대 정의 된 실행 취소 레벨까지 수행 할 수 있습니다.

실행 취소 기능은 각 스트로크 후 그림 캔버스의 내용을 Image array에 복사하여 작동합니다. 이 배열은 First-In-Last-Out Stack처럼 동작합니다. 실행 취소를 클릭하면 스택은 poped 이고 얻은 이미지가 화면에 그려집니다.

지금 제가 직면 한 문제는 현재 실행 취소 방법이 너무 많은 메모리를 차지한다는 것입니다. 20의 실행 취소 수준에서 거의 70-80MB의 메모리가 사용되며 30 단계에서 힙 오버플로가 발생합니다.

실행 취소 기능을 구현하는 더 좋은 방법이 있습니까? 감사.

편집 : 유용한 정보가 유용 할 것 같습니다. here. 도움이 될만한 정보가 있습니다.

+2

모든 뇌졸중 후 전체 이미지를 저장하는 것처럼 들립니다. 이 올바른지? 제 생각에는 각 개별 획을 저장 한 다음 모든 개별 획에 따라 이미지를 그립니다. – adchilds

+0

@adchilds 네, 각 스트로크 후 전체 이미지를 저장하고 있습니다. –

+0

@adchilds는 패치와 같은 이전의 변경 사항 만 저장하는 것을 제안합니다. –

답변

2

도면의 단계를 다르게 표현해야합니다. 현재 사용하고있는 접근 방법에서 매번 Canvas를 압축되지 않은 그림으로 저장합니다. 이는 메모리 탐욕입니다.

코드를 리팩토링하여 캔버스에 그려진 획만 스택에 저장되도록하십시오. 이렇게하면 그림을 렌더링 할 때 약간의 오버 헤드가 발생합니다 (변경이 발생할 때마다 전체 캔버스를 다시 그려야 할 것입니다). 그러나 Java는이를 처리하도록 설계되었습니다.

셰이프 만 저장하면 메모리 요구 사항이 크게 감소합니다. 캔버스에 획을 표시하려면 Shape 클래스를 사용하십시오.

+0

도형을 저장하면 벡터 스타일의 드로잉을 의미합니다 –

+0

@ 2012-EndoftheWorld 이것이 비트 맵 드로잉 인 경우에도이를 수행 할 수 있습니다. 벡터 드로잉에 Shape 클래스를 사용하는 대신 스트로크 (패스, 불투명도, 크기 등)의 매개 변수를 추적하여 대신 저장할 수 있습니다. 실행 취소를 사용하여 캔버스를 다시 칠하는 경우 메모리에서 추적 된 선을 따라 전체 사진을 다시 만들 수 있습니다. –