Cách đơn giản nhất tôi đã tìm thấy để giải quyết vấn đề này, mặc dù tôi không biết làm thế nào Adobe đã khắc phục nó, là sử dụng một cấu trúc dữ liệu liên tục, như vậy:

Bạn nghĩ một hình ảnh dưới dạng tập hợp các lát hình ảnh, mỗi trang có kích thước 64x64 pixel và chúng được thu thập rác hoặc tính tham chiếu (ví dụ: sử dụng shared_ptr
trong C++).
Bây giờ khi người dùng thực hiện thay đổi một ngói hình ảnh, bạn tạo ra một phiên bản mới trong khi sao chép cạn gạch chưa sửa đổi:

Tất cả mọi thứ trừ những gạch tối đang cạn sao chép khi một sự thay đổi như vậy. Và khi bạn làm điều đó theo cách đó, toàn bộ hệ thống của bạn lùi lại nắm này:
before user operation:
store current image in undo stack
on undo/redo:
swap image at top of undo stack with current image
và nó trở nên siêu dễ dàng như vậy mà không đòi hỏi toàn bộ hình ảnh được lưu trữ hơn và hơn trong mỗi undo nhập cảnh. Là phần thưởng khi người dùng sao chép và dán lớp, nó hầu như không mất thêm bộ nhớ nào trừ khi/cho đến khi họ thực hiện thay đổi đối với lớp được dán đó. Về cơ bản nó cung cấp cho bạn một hệ thống instancing cho hình ảnh. Như một phần thưởng khác, khi người dùng tạo một lớp trong suốt, ví dụ, 2000x2000 pixel nhưng họ chỉ vẽ một chút hình ảnh, như chỉ nói 100x100 pixel, cũng hầu như không mất bất kỳ bộ nhớ nào vì các ô trống/trong suốt không phải lưu trữ bất kỳ pixel nào, chỉ một vài con trỏ null. Nó cũng tăng tốc độ kết hợp với các lớp chủ yếu trong suốt như vậy, bởi vì bạn không phải trộn lẫn các ô hình ảnh trống và chỉ có thể bỏ qua chúng. Nó cũng tăng tốc bộ lọc ảnh trong những trường hợp đó vì chúng cũng có thể bỏ qua các ô trống.
Đối với các hành động của PS, đó là một cách tiếp cận khác. Ở đó bạn có thể sử dụng một số kịch bản để chỉ ra những hành động để thực hiện, nhưng bạn có thể kết hợp nó với các bộ đệm ở trên để hiệu quả chỉ bộ nhớ đệm sửa đổi của hình ảnh. Toàn bộ điểm của phương pháp này là tránh phải sao chép toàn bộ hình ảnh một cách toàn bộ và thổi phồng bộ nhớ sử dụng để lưu trữ các trạng thái trước đó của một hình ảnh để hoàn tác mà không cần phải viết bằng cách viết logic hoàn tác/làm lại riêng biệt cho tất cả các loại các hoạt động khác nhau có thể xảy ra.
Nguồn
2018-01-05 14:32:40
Tại sao lại đóng? Đây có phải là bản dupe hay gì đó không? Đóng cửa nên được theo sau bởi các ý kiến –
Hãy xem [chủ đề SO này] (http://stackoverflow.com/questions/3541383/undo-redo-implementation/3542670#3542670). – Lazer