Tôi đang cố gắng viết trình chỉnh sửa bitmap cho thiết bị di động (ví dụ: phiên bản giới hạn của Photoshop). Tài liệu của người dùng bao gồm ~ 4 bitmap có kích thước khoảng 1000x500.Hoàn tác/hoàn tác nhanh cho trình chỉnh sửa bitmap khi bộ nhớ bị hạn chế?
Tôi muốn một hệ thống hoàn tác/làm lại mạnh mẽ và hiệu quả đơn giản nhất có thể. Tôi đang nhắm tới khoảng 0,2 giây để hoàn tác hoặc làm lại chỉnh sửa. Tôi đang tìm một số phản hồi về cách tiếp cận dự định hiện tại của tôi hoặc cho một số ý tưởng mới mà tôi có thể sử dụng. Tôi nghĩ rằng những gì tôi có là quá phức tạp vì vậy tôi thận trọng về việc tiếp tục để chỉ biết rằng đó là điều tốt nhất tôi có thể làm sẽ tốt.
Tôi đã thử nghiệm với các kết hợp sử dụng mẫu Command và mẫu Memento cho hệ thống hoàn tác/làm lại của tôi. Một số kết luận mà tôi đã đưa ra cho đến nay là:
Tôi không có đủ bộ nhớ và không thể ghi bộ nhớ vào đĩa đủ nhanh để sử dụng bộ lưu trữ để hỗ trợ thao tác "không thực hiện" trên lệnh trước đó nhiều tình huống ví dụ nếu người dùng thực hiện một vài nét vẽ riêng lẻ một cách nhanh chóng, tôi sẽ không thể lưu trữ các ảnh bitmap đại diện cho những gì người dùng vẽ lên mà không khiến người dùng chờ chúng được lưu.
Nếu tôi khôi phục tài liệu về trạng thái ban đầu và phát lại tất cả các lệnh ngoại trừ lệnh cuối cùng để hoàn tác, điều này quá chậm sau một số lệnh khiêm tốn, ví dụ: phát lại 10 nét vẽ hoặc 5 vết nhòe mất ~ 1 giây quá chậm chạp.
Tôi có thể lấy xung quanh điểm trước đó bằng cách lưu toàn bộ tài liệu trong nền theo định kỳ vào đĩa và khôi phục đến điểm kiểm tra này trước khi phát lại lệnh. Để hoàn tác hơn nữa so với trạm kiểm soát cuối cùng, chúng tôi sẽ tải lại điểm kiểm tra trước và thực hiện lại các lệnh.
Cách tiếp cận 2 với 3 hoạt động OK ngoại trừ lưu toàn bộ tài liệu chậm hơn và chậm hơn khi thêm nhiều lớp và nó đã chậm với 4 bitmap (~ 5 - 10 giây chờ). Do đó, tôi cần phải sửa đổi 3 để tôi chỉ lưu những gì đã thay đổi kể từ lần trước.
Vì nhiều lệnh chỉ hoạt động trên một lớp, nên chỉ lưu các lớp đã được sửa đổi kể từ điểm kiểm tra cuối cùng. Ví dụ, lệnh stack của tôi có thể trông như thế này nếu tôi có 3 lớp ban đầu, nơi tôi đã chỉ ra nơi các trạm kiểm soát có thể được lưu.
(Checkpoint1: Save layer 1, 2 and 3.)
Paint on layer 1
Paint on layer 1
(Checkpoint2: Save layer 1. Reuse saved layers 2 and 3 from Checkpoint1.)
Paint on layer 2
Paint on layer 2
(Checkpoint3: Save layer 2. Reuse saved layers 1 and 3 from Checkpoint2.)
Paint on layer 3
Paint on layer 3
Flip layer 3 horizontally.
(Checkpoint4: Save layer 3. Reuse saved layers 1 and 2 from Checkpoint3.)
Resize layer 1, 2 and 3.
(Checkpoint5: Save layer 1, 2, 3.)
Trong khi chỉnh sửa, tôi theo dõi các lớp nào đã được sửa đổi kể từ điểm kiểm tra trước đó. Khi tôi khôi phục lại một trạm kiểm soát, tôi chỉ khôi phục các lớp đã thay đổi, ví dụ: để khôi phục Checkpoint4 sau khi sửa đổi lớp 2 và 3, tôi tải lại các bản sao lưu của lớp 2 và 3 từ đĩa. Khi thêm một trạm kiểm soát, tôi chỉ lưu các lớp đã được sửa đổi cho đến nay. Tôi có thể làm cho tất cả điều này chủ yếu là tự động trừ khi cần phải có chỗ trong giao diện của tôi, nơi người dùng buộc phải đợi cho các trạm kiểm soát được lưu vì tôi chỉ có thể giữ khoảng 1 bản sao tạm thời của một lớp trong bộ nhớ tại một thời điểm.
Bạn nghĩ sao? Nó phức tạp hơn nhiều so với tôi muốn nhưng tôi không thể nhìn thấy bất kỳ cách nào khác. Có bất kỳ mẫu hữu ích nào khác mà tôi có thể sử dụng để làm cho cuộc sống của tôi dễ dàng hơn không?
Cảm ơn. Điều này sẽ giúp tiết kiệm các trạm kiểm soát nhanh hơn một chút và hiệu quả về không gian hơn nhưng giúp khôi phục các điểm kiểm tra chậm hơn một chút vì tôi cần tải và kết hợp nhiều điểm kiểm tra để khôi phục trạng thái trước đó. Tôi muốn đánh giá cao một số ý kiến về tổng thể của tôi undo/redo chương trình mặc dù và làm thế nào nó có thể được thực hiện đơn giản hơn mặc dù. – memcom