精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圖形編輯器:歷史記錄設計

開發 前端
要記錄圖形編輯器的歷史記錄,支持撤銷重做功能,需要兩個棧:撤銷(undo)棧和重做(redo)棧。

大家好,我是前端西瓜哥。今天講一下圖形編輯器如何實現歷史記錄,做到撤銷重做。

其實就是版本號的更替。每個版本保存一個狀態。

數據結構

要記錄圖形編輯器的歷史記錄,支持撤銷重做功能,需要兩個棧:撤銷(undo)棧和重做(redo)棧。

每當用戶進行一個操作(比如移動一個圖形),就會產生一個新的版本,將這個操作產生的狀態保持加入到 undo 棧頂,此外 redo 棧會清空。因為用戶可能撤銷了幾次然后產生了新的操作,無法重做它們了。

當用戶撤銷,undo 棧出棧,并放到 redo 棧,然后使用 undo 棧頂的狀態。當用戶重做時,redo 棧出棧,再放到 undo 棧上,并應用 undo 棧頂的狀態。

原理大概這樣。

瀏覽器的回退前進的表現其實就是一個很常見的例子。

數據結構還有另一種方案:雙向鏈表加兩個指針,一個指針指向當前版本狀態,另一個指針指向 redo 最后一次可執行到達的狀態。

然后是如果要支持協同的場景,你的撤回不會回到之前的版本,而是將之前的版本的狀態拿出來作為一個新的版本。

協同中你也不能撤回別人的操作,只能撤回自己的,并且要用協同算法處理和其他協同者的沖突邏輯。

要保存哪些狀態

那么我們的狀態要保存哪些狀態呢?

  1. 圖形樹數據
  2. 圖形樹需要的引用
  3. 一些設置

圖形樹是必要的,我們需要用它渲染畫布內容。此外還有游離在圖形樹之外的被用到的對象,比如圖層、被多次引用的圖形。你可以也把它們也放到圖形樹里面去。

最后是一些需要共享的設置,比如表格的行高、篩選條件等。

像是顏色主題、國際化語言設置則不需要歷史記錄,它是用戶自己選擇的個性化定制。

我們看具體的幾種實現。

全量快照

每次操作得到的新狀態,完全拷貝一份保存起來。

因為對象如果只是淺拷貝,其中的引用對象可能會被意外地修改,通常我們會選擇 序列化成字符串 保存,即JSON.stringify。撤銷重做的時候再解析出來作為當前狀態。

優點是實現簡單。巨大的優點。

缺點是當狀態很大的時候,每次生成快照都會比較耗時,且操作很多產生很多版本時,需要大量的內存空間保存這些完整狀態。

如果畫布上有一萬個獨立的實體,就意味著每進行一次操作,就要將這個一萬個實體深拷貝一份。100 次就是 100w,很恐怖。

僅推薦簡單的圖形編輯器使用,或者做 demo 用。

補丁(patch)

全量快照讓編輯器的上限很低,不是最優解。

一種更好的解法,是 打補丁(patch)。

基于上一個版本 1,打一個補丁,變成下一個版本 2。同時我們記錄一個反向的補丁,撤回的時候能通過它從版本 2 回到版本 1。

這個方案對應了設計模式的 命令模式,我們構建 Command 類,這個類有 execute、redo、undo 方法,這些方法會對傳入的舊的狀態對象打補丁,得到一個新的狀態。

比如添加矩形命令,execute 和 redo 時我們會往圖形樹的末尾加一個矩形對象,undo 就是將這個矩形從圖形樹中移除。undo 棧和 redo 棧此時記錄的就是一個個 command 對象了。

圖片

純純用樸實無華的命令模式去實現,還是有點坑的。因為要實現的命令太多了,比如添加圖形、修改圖形屬性、刪除圖形、對幾個圖形做右對齊等,這些都要自己一個個實現 redo 和 undo。復雜一點就要抓瞎,建議找一些輪子。比如 immer、y.js。

使用補丁方案還有一個好處,就是方便實現 “動作” 功能。(當然這不是一個優先級很高的功能)

比如我們想要給一個圖形先順時針旋轉 45 度,然后向右移動 10 個單位,我們希望記錄這兩個操作,給其他圖形也應用這些操作。

快照的方式就不好搞,或許我們可以對比新舊狀態找不同推斷出行為,但不好搞。因為屬性的變化可能來自不同的操作,比如移動,可以通過移動工具相對位移產生,也可能直接屬性面板改 x 值,也可能是通過對齊操作產生的。

patch 就很適合。

什么時候保存狀態

我們需要確認一個操作完成的時刻,將它加入到歷史記錄中。

我們操作圖形,會產生一些 中間狀態。比如移動一個圖形,拖拽的過程中不生產一個歷史版本,直到拖拽結束才記錄。

一種方式是:操作圖形的替身,操作結束后才更新真正的狀態。

一些編輯器,比如 Adobe Illustrator、AutoCAD,我們在操作圖形的時候,會看到一個臨時的替身,就是將被選中圖形的輪廓線或拷貝做鼠標的跟隨,鼠標釋放后才真正修改圖形屬性。

還比如顏色的修改,在拾色器中挑選顏色時不會立即修改圖形,在點擊確認才真正修改圖形顯示在畫布上。

圖片

另一種方式是:直接操作真正的狀態,在操作結束的時候,記錄這個時刻的狀態。

圖片

第一種方式的好處是,狀態沒有中間狀態,替身操作完,計算出新狀態應用到真正的狀態上就好了。

第二種方式就要額外在操作開始時,保存原始狀態的快照,因為之后我們會產生中間狀態,然后在操作結束后計算 patch。

但第二種方式用戶體驗會更好些,用戶能實時看到一個圖形的變化,判斷是不是自己需要的效果,而不是看到一個 “通往未來的幻影”。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2009-08-20 16:25:05

Linux系統歷史記錄linux

2024-01-22 10:01:41

Git 提交快照

2011-10-09 14:57:35

2021-04-27 15:38:10

GoogleChrome歷史記錄

2013-12-05 17:37:57

Windows 8文件歷史記錄

2022-01-25 11:33:14

數據泄露網絡攻擊

2021-01-06 18:10:22

ShellLoki系統運維

2013-01-21 14:37:05

Windows 8歷史記錄

2021-12-15 23:33:33

Windows 11Windows微軟

2009-07-07 15:49:04

root命令歷史記錄安全性 

2017-03-27 16:15:42

ChromeVivaldi瀏覽器

2016-01-27 11:24:20

Windows 10紅石鏡像

2023-08-01 09:30:12

SQL Server數據庫

2016-01-26 15:27:16

Windows 10歷史記錄備份

2021-01-20 09:29:09

QQ瀏覽器App

2023-10-19 10:12:34

圖形編輯器開發縮放圖形

2019-10-14 16:16:49

BashLinux命令

2023-06-02 10:41:50

2022-04-29 16:47:57

AI騰訊

2020-06-01 18:20:41

Git
點贊
收藏

51CTO技術棧公眾號

精品乱码一区二区三区| 在线播放日韩欧美| 成人午夜精品久久久久久久蜜臀| 狠狠躁日日躁夜夜躁av| 欧美亚洲三区| 一区二区成人精品| 成人啪啪18免费游戏链接| 悠悠资源网亚洲青| 中文字幕日韩精品一区 | 欧洲av一区| 91精品在线视频观看| 国产一区亚洲| 国产一区二区三区丝袜| 黄色片子免费看| 三级成人黄色影院| 亚洲精品视频一区| 日韩精品国内| 人妻一区二区三区| 欧美a级一区二区| 久久久久久18| 999福利视频| 啪啪激情综合网| 欧美一区日韩一区| 无码内射中文字幕岛国片| 青春草在线免费视频| 久久精品亚洲麻豆av一区二区 | 日韩在线观看免费全| 在线中文字日产幕| 高清在线一区| 一本大道久久a久久精品综合| 国产免费xxx| yw视频在线观看| 91免费看`日韩一区二区| 亚洲一区亚洲二区| 艳妇乳肉豪妇荡乳av无码福利| 亚洲久久成人| 色综合久久久久久中文网| 在线看片中文字幕| 国产区精品区| 日韩经典第一页| 国产精品一区二区在线免费观看| 电影91久久久| 欧美二区乱c少妇| 欧美特级aaa| 欧美日韩电影免费看| 亚洲成人黄色影院| 久久国产午夜精品理论片最新版本| 蜜桃av在线免费观看| 国产精品毛片无遮挡高清| 欧美一二三区| 国产精品麻豆一区二区三区| 久久久精品影视| 欧美日韩电影一区二区三区| 天堂在线视频免费| 92精品国产成人观看免费| 国产精品二区在线| av 一区二区三区| 国产精品一级二级三级| 91精品视频专区| 国产偷拍一区二区| 国产精品一区专区| 粉嫩av免费一区二区三区| 性一交一乱一精一晶| 国产成人精品网址| 国产精品一区二区你懂得| 亚洲精品久久久久久久久久久久久久 | 精品久久久av| 九九精品视频免费| 伊人色**天天综合婷婷| 欧美理论片在线观看| 精品午夜福利视频| 一本色道久久综合亚洲精品高清 | 国产系列第一页| 久草中文在线观看| 亚洲综合视频网| 国产二区视频在线| 亚洲成a人片| 欧美亚洲综合色| 亚洲理论中文字幕| 日韩区欧美区| 日韩成人在线视频| 一级片久久久久| 伊人青青综合网| 高清欧美一区二区三区| 无码人妻精品一区二区| 激情综合网av| 国产精品加勒比| 国产福利第一视频在线播放| 成人欧美一区二区三区| 亚洲色欲久久久综合网东京热| 国产精品13p| 欧美三级电影精品| 人妻激情偷乱频一区二区三区| 欧美三级午夜理伦三级小说| 一区二区三区久久精品| 久久久久久久9999| 日韩综合小视频| 91福利入口| 可以免费看污视频的网站在线| 国产精品久久久久久福利一牛影视| 91看片淫黄大片91| 超碰超碰人人人人精品| 制服丝袜激情欧洲亚洲| 国产精品一区二区入口九绯色| 久久亚洲精品中文字幕蜜潮电影| 欧美激情亚洲精品| 亚洲免费视频二区| 99久久精品国产网站| 中文字幕中文字幕一区三区| 爱搞国产精品| 欧美高清激情brazzers| 久久国产精品影院| 欧美国产三级| 国产精品尤物福利片在线观看| 手机在线观看毛片| 亚洲老妇xxxxxx| 精品久久久噜噜噜噜久久图片 | 久久精品丝袜高跟鞋| 成人在线观看亚洲| 欧美日韩综合在线免费观看| 又黄又爽的网站| 亚洲欧洲美洲一区二区三区| 秋霞成人午夜鲁丝一区二区三区| 成人高潮片免费视频| 国产精品欧美一级免费| 欧美成人xxxxx| 2023国产精华国产精品| www.亚洲一区| 黄色av一区二区| 99re8在线精品视频免费播放| 久久最新免费视频| 亚洲狼人在线| 色狠狠av一区二区三区香蕉蜜桃| 日韩中文字幕在线观看视频| 国产成人av一区二区三区在线| 亚洲巨乳在线观看| 亚洲综合在线电影| 亚洲欧美国内爽妇网| 国产成人一区二区三区影院在线| 粉嫩一区二区三区性色av| 一区二区三视频| 日本一区二区中文字幕| 中文字幕av一区二区三区谷原希美| 五月激情六月丁香| 99re视频精品| 国产九九九九九| 欧美wwwsss9999| 国产最新精品视频| 亚洲欧美激情国产综合久久久| 一区二区三区中文在线| 色哟哟在线观看视频| 婷婷精品进入| 91久久精品视频| 在线黄色网页| 精品粉嫩超白一线天av| 日本三级片在线观看| 懂色av一区二区夜夜嗨| r级无码视频在线观看| 国产精品三p一区二区| 久久久久久久久久久国产| 免费观看黄一级视频| 粉嫩老牛aⅴ一区二区三区| 亚洲熟女乱综合一区二区三区| 激情婷婷欧美| 欧美另类视频在线| 777午夜精品电影免费看| 中文字幕一精品亚洲无线一区 | 久久久www免费人成黑人精品| 国产亚洲成av人片在线观看 | 激情成人亚洲| 精品久久久久久一区| 天堂av中文在线观看| 亚洲区中文字幕| 亚洲 国产 日韩 欧美| 国产精品污www在线观看| 亚洲第一区第二区第三区| 亚洲午夜在线| 蜜桃麻豆91| 久久国产三级| 国内自拍欧美激情| 懂色av中文在线| 欧美一区二区三区视频免费播放 | 女同性一区二区三区人了人一| 国产精品嫩草在线观看| 香蕉成人av| 美女精品视频一区| 无码精品人妻一区二区| 欧洲国内综合视频| 国内偷拍精品视频| 久久一日本道色综合| 亚洲精品国产一区二区三区| 一区在线视频观看| 婷婷四房综合激情五月| 亚洲3区在线| 国产成人在线亚洲欧美| 青春草视频在线观看| 一区二区欧美在线| 免费成人在线看| 欧美日韩在线精品一区二区三区激情| 超碰在线国产97| 久久在线免费观看| 国产探花一区二区三区| 久久只有精品| 日本男女交配视频| 青青草91久久久久久久久| 国产伦精品一区| 国产亚洲精彩久久| 午夜精品福利在线观看| 黄网页在线观看| 亚洲欧美中文字幕| 亚洲第一天堂在线观看| 欧美三级韩国三级日本三斤| 日产电影一区二区三区| 日韩美女精品在线| 久久久久亚洲av成人无码电影| 国产成人综合亚洲91猫咪| 天天爱天天操天天干| 国产婷婷精品| 久久久久久久久久久综合| 日韩综合在线| 欧美日产一区二区三区在线观看| 6080成人| 91免费人成网站在线观看18| 日韩免费va| 91国自产精品中文字幕亚洲| 中文字幕伦理免费在线视频| 这里只有精品在线观看| 欧洲天堂在线观看| 亚洲国产高清福利视频| 国产成人精品亚洲精品色欲| 欧美人动与zoxxxx乱| 无码无套少妇毛多18pxxxx| 欧美日韩国产一区在线| 国产精品第72页| 一区二区三区精品在线观看| 一区二区三区影视| 日韩美女视频一区二区 | av在线不卡免费观看| 蜜桃麻豆91| 亚洲区小说区图片区qvod| 国产在线精品一区二区三区| 91精品导航| 国产成人女人毛片视频在线| 在线播放成人| 91精品视频观看| 国产精品美女久久久久| 成人黄色在线免费| 亚瑟国产精品| 91色在线视频| 精品亚洲二区| 5g国产欧美日韩视频| 久久久久亚洲精品中文字幕| 亚洲xxxxx电影| 欧美成人精品一级| 俄罗斯精品一区二区| 超碰地址久久| 精品国产综合| 免费一区二区三区视频导航| 欧美亚洲免费在线| 日本电影一区二区| 综合一区中文字幕| 欧美大片一区| 免费看国产曰批40分钟| 国产欧美日韩一区二区三区在线| 欧美成人xxxxx| 日本特黄久久久高潮| 亚洲天堂网一区| 国产一区二区影院| 性生交大片免费看l| 波多野结衣中文一区| 人妻丰满熟妇aⅴ无码| 国产欧美精品一区| 好吊日在线视频| 亚洲成人精品一区二区| 日韩三级一区二区| 欧美挠脚心视频网站| 精品国产黄色片| 亚洲精品不卡在线| 成年人在线视频| 欧美成人三级视频网站| 美女网站在线看| 国产精品高潮在线| 国产95亚洲| 久久99九九| 色一区二区三区四区| 日韩一级性生活片| 日韩电影网1区2区| 苍井空张开腿实干12次| 久久久久久夜精品精品免费| 日本伦理一区二区三区| 亚洲高清中文字幕| 波多野结衣毛片| 日韩精品中午字幕| 欧美日韩激情视频一区二区三区| 久久色在线播放| 在线免费观看亚洲视频| 久色成人在线| 91pony九色| 久久亚洲一级片| 国产精品免费人成网站酒店| 欧美日韩国产丝袜另类| 一区二区三区精彩视频| 日韩精品在线私人| 9191在线播放| 国产精品日韩在线| 欧美中文一区| 超碰97在线看| 蜜臀va亚洲va欧美va天堂| 性囗交免费视频观看| 日韩一区欧美小说| 日韩精品一区不卡| 亚洲成人精品久久久| 国产精品成人免费观看| 日韩午夜视频在线| 国产精品一香蕉国产线看观看| 视频亚洲一区二区| 亚洲精品中字| 美女精品网站| 日韩成人av影院| 中文字幕中文在线不卡住| 天天综合网入口| 日韩你懂的电影在线观看| 国内精品在线视频| 性色av香蕉一区二区| 精品国产一区二区三区性色av | 国产成人精品视频ⅴa片软件竹菊| 国产精品夜夜嗨| 91香蕉国产视频| 色激情天天射综合网| 欧洲成人一区二区三区| 久久成人18免费网站| 久久99国产精品二区高清软件| 免费中文日韩| 99在线|亚洲一区二区| 91精产国品一二三| 亚洲免费av观看| 国产农村妇女毛片精品| 日韩一区二区av| 黑人一区二区三区| 亚洲欧美成人一区| 青青草国产成人av片免费| 亚洲 小说 欧美 激情 另类| 欧美日韩国产影院| 五月激情婷婷综合| 69av在线视频| 欧美日日夜夜| aⅴ在线免费观看| www国产精品av| 精品国产午夜福利| 亚洲欧美激情精品一区二区| 中文在线免费视频| 欧美精品一区二区三区久久| 久久激情一区| 精品人妻一区二区三区四区| 欧美亚洲综合另类| 免费在线观看黄| 亚洲精品欧美一区二区三区| 伊人久久大香线蕉精品组织观看| 久久精品无码一区二区三区毛片| 亚洲女与黑人做爰| www.久久色| 久久久中精品2020中文| 老汉色老汉首页av亚洲| 丝袜老师办公室里做好紧好爽| 久久综合国产精品| 亚洲精品91天天久久人人| 色阁综合伊人av| 亚洲电影一区| 国产主播自拍av| 2017欧美狠狠色| 国产情侣呻吟对白高潮| 久久久国产成人精品| 亚洲精品黑牛一区二区三区| 久久综合久久网| 国产视频911| 国产毛片久久久久| 欧美精品福利在线| 亚洲尤物av| 中文字幕线观看| 亚洲国产日产av| 国产一区二区影视| 亚洲qvod图片区电影| 一区二区三区四区五区精品视频 | 欧美日韩国产999| 亚洲另类av| 中文字幕免费高清在线| 一区二区国产盗摄色噜噜| 天堂在线中文| 亚洲一级电影视频| 一区二区三区网址| 国产日韩欧美制服另类| 91欧美日韩麻豆精品| 久久久中精品2020中文| 欧美精品一区二区久久| 亚洲女人在线观看| 色婷婷亚洲一区二区三区| 亚洲综合图区| 日韩免费三级| 成人在线一区二区三区| 最近中文字幕在线视频|