為什麼 Photoshop 不能無限撤銷?

為什麼 Photoshop 不能無限撤銷,好像最多只能撤銷1000步。而手機上的一些修圖app就可以,比如潑辣修圖,比如snapseed,無限撤銷感覺也不會佔用很多內存啊,那麼無限撤銷的原理是什麼?為什麼 PS 至今不能做到?


首先你要了解,圖片的修改分為 distructive 和 non-destructive。像 Lightroom/CameraRAW 和你提到的手機修圖,它們都是 non-destructive 方式。

Non-destructive 是你的任何編輯都可以用一種數據量遠遠小於原圖的參數來描述。比如曝光度的變化,彩色變黑白,加暗角。但是 non-destructive 的局限性也很大。Edit 的種類有限,而且不能做二次編輯的疊加。

Non-destructive 的歷史你存一萬個也沒事,因為只是一些參數而已。

Photoshop 的大多數操作都是 destructive 操作。每次操作要記錄的歷史信息都是一大塊 pixels data。雖然有 copy-on-write 和 disk swap 功能,也不能無限的支持。


實際上,是有可能做到無窮步驟的。大不了只需要把內存存放的歷史數據倒騰到硬碟上就可以,我的軟體就是這樣處理的,步驟無限制。但是Photoshop為什麼不這樣做呢?

因為如果要恢復到歷史上任意一步,那麼最簡單把當時的所有數據都存下來即可這個前面的答案提到了。但是現在數碼相機像素動則幾千萬,再建立幾個圖層,這一步數據就可以達到,以2千萬像素16bit通道圖片為例。就這個圖層就佔用了,20000000 x 3通道 x 2byte = 120000000 = 120M 空間。加上掩模和其他圖層....這還只是一步的數據。

那麼存儲10步就需要1.2G了,要知道32bit系統最多也就能分配給程序1G多程序。所以即便是有限步驟,按照這樣的存法,不管是存到內存還是硬碟,都是不太可行的。能壓縮么?不太可行,因為歷史紀錄必須保證是無失真的,否則來回恢復-重做幾次,圖片就損失得不能看了。而無失真壓縮一個圖片,壓縮率之低,做過圖片壓縮的同學應該很清楚吧。

所以就動腦筋了,每一步只存儲變化的區域,這是一個簡單方法。只記錄處理參數,這也是個辦法...但是這樣的辦法又帶來另外一個問題,就是依賴性。如果要恢復到特定步驟,那麼,就得從最開始的圖片開始,重新重複每一個步驟的變化,最後得到特定步驟的重現。如果處理步驟很多,那麼要恢復上1,2步就變得非常慢。不能接受。

這類似於視頻壓縮的I幀和P幀的關係。那麼按照一定規則,插入I幀,提高速度?當然可以,這樣雖然會耗費多一點存儲,但是兼顧了速度。

以上講的是歷史紀錄大致的結構和原理。

那麼現在只剩下一個問題,就是這些數據放在內存還是硬碟上? 放在內存,響應很快,但是內存有上限,尤其是32bit系統;放在硬碟,典型硬碟讀速度在100M/s,SSD快一些,也只有400M左右,那麼僅僅是讀取上面說的一步數據,而且還是理想情況下,光導入到內存就需要1秒鐘。而內存的速度一般是以幾十GB數量級的(上百倍)。所以這個瓶頸會造成恢復很慢

考慮到Photoshop的目標是做設計為主,設計師反覆的恢復-重做操作相當多,因此,對響應速度要求高,所以選擇犧牲步數,換取性能的內存方式比較適合。(而我的軟體處理簡單,用戶也一般不需要用歷史紀錄,所以就放硬碟上,I,P幀方案,不做步數限制。實際操作中,歷史恢復速度的確是比較慢的(5秒級別))。

當然,實際Photoshop中的實現會複雜很多,它有一套設計得很好的內存管理機制。這裡就不展開了。


每次撤銷都得保存一個新版本。無限撤掉需要無限存儲空間支持。PS是專業軟體,美工做圖每個文件上GB都是常見的。1000次撤銷最高可能需要幾個T的硬碟存儲空間。再多也沒有實用價值了。


ps本身文件大,如果無限次撤銷,內存和硬碟緩存佔用就會太大,效率反而低


曾經做過測試,作為測試如果開發敢在規格里寫無限撤銷,我直接一板磚就拍過去。只問一個問題,怎麼才能通過測試證明確實可以無限撤銷?如何驗收這個需求?

不考慮內存和硬碟限制,一秒可以完成一次操作或者撤銷,通過腳本測試一年的操作加一年的撤銷。那麼最多可以測試到多少層的撤銷呢?

365*24*3600=不到4千萬,而這個數字可以代表無限嗎?不能!你怎麼知道5千萬或者一億的時候沒有問題?畢竟連32位INT的百分之一都還沒有到,你怎麼知道之後會不會有溢出(操作編號)。

軟體是不能用數學歸納法來證明沒有問題的,所以規格寫無限的一定是吹牛!


好多專業的回答。

但是在歷史記錄面板里就可以啊。


要圖層幹嘛的


那你在手機上撤銷過一千次嗎?

為何會覺得不佔用內存啊? 每次都生成一個臨時文件在你的緩存檔里啊 。

當你有足夠的空間你可以設緩存到無限大試試


從實用角度說,多建層,並在合併任何層之前保存為備份的版本,基本就夠後悔用的了。


純屬無聊加蛋疼的問題,1000步的你一下一下退回去。保證酸爽死你。


無限撤銷?你重新做吧。。。得了


不是有圖層嗎,撤銷那麼多沒有意義


是不是因為,你撤銷的的這一步已經成為了上一步,再撤銷就回到了撤銷那一步,然後就是一直這兩步循環了

用歷史記錄挺方便的


反對高票adobe程序員的答案。扔出來一堆名詞,繞來繞去也根本沒解釋清楚為什麼不能無限撤回。

說到底不就是緩存嗎?跟destructive和non-destructive有什麼關係?你ps設置可以撤銷20步,這20步以內不管你de不destructive是不是都可以撤銷?真是無語


推薦閱讀:

日常回答存根3——如何模擬任意一張照片的後期?
逆天PS:他把現實ps到童年照片之後,一點也不違和
小清新詳細教程,Lightroom直出調色
從0開始學修圖 | 調色風格化之色調分離,你值得擁有

TAG:AdobePhotoshop | 攝影 | 平面設計 | 修圖 | Photoshop使用技巧 |