2009-04-04 5 views
7

이 문제는 일반적으로 일반적으로 드로잉 시스템에 적용됩니다. 실행 취소 기능이 PS에서 어떻게 구현되는지 궁금합니다. 각 작업 전에 캔버스의 스냅 샷을 찍습니까? 그렇다면 엄청난 메모리가 필요하지 않을까요? 커맨드 패턴을 살펴 봤지만 이것이 드로잉에 어떻게 적용되는지는 꽤 볼 수 없습니다.Photoshop Undo System

감사는 메노

+0

왜 닫습니까? 이거 속임수 같은거야? 폐회 뒤에 코멘트가 있습니다. –

+0

[이 SO 스레드] (http://stackoverflow.com/questions/3541383/undo-redo-implementation/3542670#3542670)를보십시오. – Lazer

답변

12

는 그것은 command pattern를 불렀다. 모든 종류의 편집기에 유용하게 구현하는 것이 간단합니다.

Photoshop은 원본 이미지에 스택 변환을 적용합니다. 하나의 opetation one 명령. 실행 취소 할 때 변환을 단순히 적용합니다. 따라서 원래 버전과 최신 버전을 유지할 수 있지만 성능 향상을 위해 마지막 몇 가지 버전을 캐시 할 수 있습니다.

+0

이것을 WYSIWYG 편집기에서 구현했습니다. 처음에는 불가능한 것처럼 보이지만 일단 패턴을 파악하면 정말 쉽습니다. –

+0

그건 저와 같은 경험이었습니다. 결코 작동하지 않을 것이라고 생각 했었습니다. 비밀리에해야한다고 생각 했었지만, 일단 끝내면 그냥 작동했습니다. –

+0

사실 현재 버전은 기존 버전이며 명령 내역은 실제로 뒤집어 진 명령 목록. 적어도 워드 프로세서는 그렇게 할 것입니다. – jmucchiello

4

일부 작업은 되돌릴 수 없으므로 스냅 샷을 할 때마다 전체 이미지가 문제가되지 않을 것이므로 필자가 볼 수있는 유일한 대안은 델타 스택 일 것입니다. 델타는 조작 전에 수정 된 픽셀을 포함하는 마스크 세트입니다. 물론 많은 연산들이 역전 될 수있어 델타가 최적화 될 수 있습니다.

+0

또한 Photoshop에서는 실행 취소 정보로 하드 디스크를 사용하므로 추가 메모리 요구 사항이 없습니다. – Joey

-2

포토샵에서는 기록을 사용하여 작업을 추적합니다. 이들은 또한 언제든지 역사에서 돌아갈 수있는 것처럼 실행 취소 기능을합니다. 환경 설정에서 기록의 크기를 설정할 수 있습니다.

Adobe Version Cue를 되돌아보기 실행 취소 또는 버전 용 도구로 사용하는 것이 좋습니다.이 도구는 해당 용도로만 사용됩니다. http://en.wikipedia.org/wiki/Adobe_Version_Cue

+0

이 질문은 구현 세부 사항입니다. – tmcw

4

나는 어도비 포토샵이 undo을 구현하는 방법을 잘 모르겠지만, Apple Shake 합성 응용 프로그램 내에서 페인트 노드는 설명하기 매우 쉽다 :

  • 각 스트로크는 약간의 정보와 함께 포인트로 저장됩니다 브러시 크기와 같은 효과가 적용됩니다.
  • 스 토크를 그릴 때 현재 이미지에서 변경됩니다.
  • 모든 x 스트로크 (10 생각) 현재 이미지가 메모리에 캐시됩니다.
  • 실행 취소하면 이전 캐시 된 이미지에서 마지막 ~ 9 개의 스톡을 다시 그립니다.

    • 당신이 10 배 이상을 취소 할 때, 전체 이미지를 다시 계산해야한다 :

    이 두 가지 문제가 있습니다. 수천 회의 스트로크로 몇 초의 일시 정지가 발생할 수 있습니다.

  • Shake를 사용하면 실제 픽셀 값이 아닌 스트로크 정보가 포함 된 설정 파일을 저장합니다. 그런 다음 Paint 노드를 다시 열거 나 이미지를 렌더링 할 때마다 전체 이미지를 다시 계산해야한다는 것을 의미합니다 (그러나 실행 취소 문제만큼 큰 문제는 아닙니다).

음, 인 흔들어, 페인트 노드 중 하나를 beign 무섭게 버그와 가난 많은 지역에서 구현 즉, 세 번째 문제가있다 - 그래서이 얼마나 잘 구현 모르겠지만, Photoshop이 너무 유사하지 않다는 것을 상상할 수는 없습니다 (단 까지 최적화가 더 좋음).

enter image description here

당신의 생각 :

0

내가 어도비가 태클하는 방법을 모르겠어요 불구하고,이 문제를 해결하기 위해 찾은 가장 쉬운 방법은,과 같이, 영구 데이터 구조를 사용하는 것입니다 이미지 타일 컬렉션, 예를 들어 각각 64x64 픽셀, 그리고 가비지 수집 또는 참조 계산 (예 : C++에서 shared_ptr 사용). 그 어두운 타일 이러한 변화에 복사 얕은입니다 제외

enter image description here

모든 :

이제 사용자가 이미지 타일을 변경을 할 때, 당신은 새로운 버전의 얕은 복사하는 동안 수정되지 않은 타일을 만들 수 있습니다.

before user operation: 
    store current image in undo stack 
on undo/redo: 
    swap image at top of undo stack with current image 

을 그리고 이상 저장을 통해 각 항목을 취소에서 할 수있는 전체 이미지를 필요로하지 않고 같은 아주 쉽게됩니다 : 당신이 그런 식으로 할 때, 전체 실행 취소 시스템이로 요약된다. 사용자가 레이어를 복사하여 붙여 넣을 때 보너스로, 붙여 넣은 레이어를 변경하지 않는 한 더 이상 메모리를 거의 사용하지 않습니다. 기본적으로 이미지를 인스턴스화하는 시스템을 제공합니다. 또 다른 보너스로, 사용자가 2000x2000 픽셀의 투명 레이어를 만들었지 만 100x100 픽셀처럼 약간의 이미지 만 페인트하면 빈/투명 타일이 거의 필요하지 않으므로 거의 메모리를 차지하지 않습니다. 모든 픽셀을 저장해야하며, 두 개의 null 포인터 만 저장해야합니다. 빈 이미지 타일을 알파 블렌드 할 필요가 없으며 건너 뛸 수 있기 때문에 대부분 투명 레이어로 합성 속도를 높입니다. 또한 빈 타일을 건너 뛸 수 있기 때문에 이미지 필터의 속도도 빨라집니다.

PS 작업은 다른 접근 방법입니다. 여기서 어떤 스크립트를 사용하여 수행 할 작업을 지정할 수 있지만 위와 결합하여 이미지의 수정 된 부분 만 효율적으로 캐시 할 수 있습니다. 이 방법의 요점은 이미지 전체를 계속해서 전체적으로 복사해야하는 것을 피하고 모든 종류의 분리 된 실행 취소/다시 실행 논리를 작성하지 않고도 실행 취소 할 이미지의 이전 상태를 캐시하기 위해 메모리 사용량을 날려 버리는 것을 피하는 것입니다. 발생할 수있는 다른 작업.