Adobe bunu ele nasıl bilmiyorum da, bu sorunu çözmek için bulduk kolay yolu, bu nedenle gibi kalıcı veri yapısını kullanmaktır görüntü karoları topluluğu olarak bir görüntü, her biri 64x64 piksel diyelim ve toplanan çöpleri veya referansları saydılar (örn: C++ içinde shared_ptr
kullanarak). O karanlık fayans böyle bir değişimden üzerine kopyalanan sığ hariç
Everything:
Şimdi kullanıcı bir görüntü döşemek için değişiklikler yaptığında, yeni bir sürümünü sığ kopyalama sırasında değiştirilmemiş fayans oluşturun.
before user operation:
store current image in undo stack
on undo/redo:
swap image at top of undo stack with current image
Ve bitti saklanabilir ve üzerinde her girişi geri de olmak tüm görüntüyü gerektirmeden böyle süper kolaylaşır: Eğer bu şekilde yaptığımda, tüm geri alma sistemi bu aşağı kaynar. Kullanıcılar katmanları kopyalayıp yapıştırdıklarında bonus olarak, yapıştırılan katmanda değişiklik yapana kadar, daha fazla bellek harcar. Temelde size görüntüler için bir kayıt sistemi sağlar. Bir başka bonus olarak, bir kullanıcı 2000x2000 piksel saydam bir katman oluşturduğunda, ancak sadece 100x100 piksel gibi bir görüntü çiziyorlar, bu da boş/saydam karoların olmaması nedeniyle neredeyse hiç bellek almıyor. herhangi bir piksel, sadece bir çift boş gösterici saklamak zorunda. Ayrıca, çoğunlukla saydam katmanlarla birleştirmeyi hızlandırır, çünkü boş görüntü döşemelerini alfa harmanlamak zorunda değilsiniz ve sadece bunları atlayabilirsiniz. Aynı zamanda, bu gibi durumlarda görüntü filtrelerini de hızlandırır, çünkü aynı şekilde boş kiremitleri de atlayabilirler.
PS eylemlerine gelince, bu biraz farklı bir yaklaşım. Orada, hangi eylemlerin gerçekleştirileceğini belirtmek için bazı komut dosyaları kullanabilirsiniz, ancak görüntünün yalnızca değiştirilmiş kısımlarını verimli bir şekilde önbelleğe almak için bunu yukarıdakilerle birleştirebilirsiniz. Bu yaklaşımın bütün noktasını, resmin bütünlüğünü derinlemesine kopyalamaktan kaçınmak ve her türlü görüntü için ayrı bir geri alma/yineleme mantığını yazmak zorunda kalmadan bir resmin önceki durumlarını geri almak için bellek kullanımını havaya uçurmaktan kaçınmaktır. Oluşabilecek farklı işlemler.
Neden kapatılıyor? Bu bir dupe falan mı? Kapanış, yorumlarla takip edilmelidir –
[Bu SO parçacığı] 'na bir göz atın (http://stackoverflow.com/questions/3541383/undo-redo-implementation/3542670#3542670). – Lazer