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

Figma 是如何做協同編輯的?

開發 前端
協同編輯,需要用到數據一致性算法,目前成熟的算法有 OT 和 CRDT。Figma 沒用 OT,太復雜,尤其是當離線數據本地緩存了很久才提交時,會進行復雜的 OT 算法計算,產生組合爆炸問題。

大家好,我是前端西瓜哥。

我一直對圖形編輯器如何做多人協同編輯很感興趣,最近讀了 Figma 前 CTO Evan Wallace 的文章《How Figma’s multiplayer technology works》,很有收獲,于是寫了這篇筆記。

我建議讀者直接閱讀原文,里面還有動圖。

https://madebyevan.com/figma/how-figmas-multiplayer-technology-works/

參考 CRDT

協同編輯,需要用到數據一致性算法,目前成熟的算法有 OT 和 CRDT。

Figma 沒用 OT,太復雜,尤其是當離線數據本地緩存了很久才提交時,會進行復雜的 OT 算法計算,產生組合爆炸問題。

CRDT,也有一定復雜度,而且是去中心的,Figma 還是需要一個中心服務實現鑒權功能。

OT 和 CRDT 更多是針對富文本編輯的,而 Figma 是設計工具,作者認為沒有必要引入這些復雜的東西,這樣會讓項目難以維護。

Figma 最終選擇借鑒 CRDT 的思想,自己實現一套協同系統。

這里我比較贊同,我永遠認為 “不要過早擴展”,能簡單就不要復雜。

因為一些后期不一定會用到的功能,強行做了更復雜的抽象和擴展,導致功能開發的心智負擔過重,當發現這些后期功能不需要,并且要擴展另一個方向的一套功能時,原本抽象的設計變得毫無意義,且一切都積重難返,最后的結果只能是屎上雕花了。

沖突處理

Figma 的設計文件的數據是一棵圖形樹,圖形之間可能會有父子關系,比如一個 group 下有一個 rectangle,形成多層的樹結構。協同編輯操作的對象就是這么一棵樹。

Figma 協同操作的最小原子是 對象的屬性。

修改同一個對象的不同屬性沒有沖突問題。

多個用戶同時修改同一個對象的相同屬性時,最晚提交到服務端的值會覆蓋其他用戶的值,包括文本內容。

假設一個屬性的值是 B,一個用戶修改為 AB,另一個用戶修改為 BC,最終同步后,他們不會得到 ABC,只會是 AB ,或者 BC,看誰最晚提交。

這個其實在大多協同表格應用也是類似的,單元格的內容也是最后提交者優勝,只有富文本文檔才要求得到 ABC。

處理閃爍現象

首先要明確 Figma 協同編輯的基本要求:

  • 可以本地立即修改,而不是提交后再更新,這是為了有絲滑的用戶體驗,同時也能支持離線編輯能力;
  • 使用中心服務,而不是去中性化(說你呢 CRDT),Figma 的服務端會維護圖形樹,作為最終的權威,并負責修正用戶提交的數據。

當多個用戶同時修改同一個對象屬性時,服務端返回的有沖突的屬性值如果立即給對象應用上,可能會有 “閃爍” 現象

是這么一個場景,在同一時間,用戶 A 將圖形改成紅色(本地改成紅色然后提交到服務器),用戶 B 改成黃色,用戶 B 比用戶 A 更早提交到服務器。

對于用戶 A,他會先看到顏色從紅色變成黃色,黃色再變成紅色,這種不期望的 “閃爍” 現象。

解決方式是,用戶 A 提交將顏色改成紅色的操作,要等待服務端確認。在等待服務端確認期間,如果收到其他用戶修改同一個屬性的操作(用戶 B 改成黃色),會把這個改動 丟棄。

之后用戶 A 收到服務端的確認消息后,如果此時有個用戶 C 修改圖形為紫色的操作同步過來,就會走正常的流程,將圖形改成紫色。

創建與刪除

創建類似前面的做法,也是最后寫入者優勝。(沒理解)

對于刪除操作,Figma 服務器不會保存被刪除的數據,這么做是為了防止文檔大小持續增長。

被刪除的數據由進行刪除操作的客戶端負責,該客戶端可通過 undo(撤銷)恢復。

系統需要保證 id 的一致性。

做法是給每個客戶端分配一個唯一 id,將其作為新創建對象 id 的一部分。這樣兩個客戶端就不會生成相同的對象 id 了。(這有點像雪花算法)

更改對象的父元素

修改對象的位置是 Figma 系統中最復雜的部分。

其復雜度來自移動一個對象到另一個父節點操作。需要做到:

  • 該移動操作不和該對象的其他無關屬性沖突;
  • 并發的兩個操作不會導致一個對象同時在多個父元素下。

很多做法是 “刪除+重新創建” 表示對象的移動,但這會導致 id 的改變,對 Figma 并不合適。

Figma 最后選擇給對象加一個屬性,指向它的父節點。這樣 id 得以保持不變,多個用戶同時進行操作只是在改這個屬性,也有效避免了副本的出現。

副本指的是,兩個用戶同時分別把一個圖形放到不同的父節點上,如果用的是修改 children 數組的方式,就會導致兩個父節點都掛著同一個圖形的引用。

然后還有一個 “環” 的問題,假設 B 和 C 是兄弟節點,一個用戶將 B 放到 C 下,另一個用戶把 C 放到 B 下,就會產生一個環。

解決方法是,最先改變父子關系,會作為最終狀態。假設用戶 1 將 C 放到 B 下的操作先到服務器,服務器會應用它。此時服務器收到用戶 2 把  B 放到 C 下的同步信息,服務器會將其駁回,帶上真正的父節點 id。

在駁回前,用戶 2 其實收到了用戶 1 的操作,客戶端此時會將 A 和 B 臨時形成環,然后移出圖形樹,接著駁回的信息回來,客戶端就能確定父節點,然后恢復到圖形樹中。

該方法并不是非常好,因為圖形消失了一段時間,但方案比較簡單,且這種場景非常罕見,Figma 不打算用更復雜的方案。

順序一致性

如果多個用戶同時修改一個節點下的兄弟節點的位置,如何保證它們的最終順序是一致的?

Figma 使用了 “Fractional Indexing”(小數索引) 技術。

兄弟節點會分配一個大于等于 0,小于 1 的小數索引值。

插入新的節點,會取于它相鄰的兩個節點的索引值的中間位置,比如要在索引為 0.3 和 0.4 的中間插入新節點,這個節點的索引值會標記為 0.35。

如果出現索引值相同的情況,服務端會進行糾正,把更晚提交的新節點的索引往后移動一點。

實現撤銷(undo)

單機的 undo,是將狀態會恢復到上一個時間點,如果不加以改變,換成多人協同,就會導致當前用戶的操作在其他用戶撤銷時被覆蓋。

Figma 團隊總結了一個重要的準則:撤銷后復制了一些東西,然后重做到當前位置,文檔不應該被改變。

Figma 的做法是 改歷史記錄。

Figma 會在用戶撤銷的時候修改重做歷史,以及在重做的時候修改撤銷歷史。

用戶 A 和用戶 B 都打開一張圖紙,其中一個圖形原來是紅色。用戶 A 將其更換為藍色,同步,此時雙方都看到圖形是藍色。

此時用戶 B 又將圖形改成黃色,同步,此時雙方都是黃色的。。

用戶 A 進行撤銷操作,撤銷為紅色(因為撤銷棧記錄的是紅變藍),此時重做棧的命令對象跑到重做棧,本來應該是藍變紅,但是 最新的文檔狀態是黃色,所以這里強行把替換為黃變紅。

這樣歷史記憶就被篡改了,可以保證重做后能回到最新狀態。

對于用戶 B,則不需要修改,因為他的歷史記錄是就是紅變黃(黃是最終狀態)。

要點

最后是作者的一些心得:

  • CRDT 的文獻很有參考價值,即使你不打算做非中心化協同;
  • 可視化編輯器的協同編輯并沒有想象中難做;
  • 在開做之前先調研并實現原型是非常有價值的。

結尾

文章看下來,大概有一些圖形編輯器如何做協同編輯的概念了,以后有機會實踐一下。

其中一點我是非常贊同的,就是方案能簡單就不要復雜,我不是很喜歡一些高度抽象的東西,代碼是寫給人看的,只是順便讓機器執行而已。

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

2024-01-15 07:42:37

Figma協同編輯算法

2012-03-12 16:42:54

測試

2011-08-01 09:08:49

程序員

2023-08-07 08:01:15

2024-03-27 08:09:48

Figma協同編輯算法

2021-05-13 08:00:00

軟件測試程序IT

2022-12-07 11:21:30

Reactdiff

2017-11-16 21:21:18

DevOps測試軟件開發

2021-07-06 10:03:05

軟件開發 技術

2024-06-17 09:01:14

2019-09-15 14:07:49

2015-07-30 11:21:16

代碼審查

2022-08-29 08:08:58

SQLOracleCPU

2022-08-03 09:11:31

React性能優化

2023-01-18 23:52:07

RTA用戶粒度運營

2015-08-11 09:13:16

2048WEB開發

2014-04-15 18:05:16

ShareSDK社會化分享林帆

2022-04-27 11:46:56

設計師設計目標設計方案

2020-12-22 10:22:12

QQ運動騰訊用戶
點贊
收藏

51CTO技術棧公眾號

av网站免费在线看| 亚洲色欲综合一区二区三区| 99在线观看精品视频| 影音国产精品| 亚洲亚裔videos黑人hd| 亚洲制服中文字幕| 国产在线精彩视频| 国产精品午夜在线| 国产精品久久精品国产| 免费又黄又爽又猛大片午夜| 欧美暴力喷水在线| 亚洲深夜福利网站| 国产精品区一区| 国产无套丰满白嫩对白| 亚洲欧洲日韩| 亚洲色在线视频| jjzz黄色片| 欧洲亚洲精品久久久久| 精品毛片三在线观看| 自拍另类欧美| 黄色片免费在线| 成人黄色综合网站| 亚洲mm色国产网站| 中文在线第一页| 尤物精品在线| 欧美成人国产va精品日本一级| 国产一线二线三线在线观看| 欧美777四色影视在线| 国产一区不卡精品| 国产精品欧美日韩久久| 国产精品xxxx喷水欧美| 欧美在线视屏| 大胆人体色综合| 成人一级片免费看| 国产aⅴ精品一区二区三区久久| 欧美成人精品1314www| 亚洲欧美日本一区二区三区| 在线观看欧美日韩电影| 亚洲动漫第一页| 免费的av在线| 亚洲AV无码精品自拍| 日本不卡视频在线| 久久中文字幕视频| 亚洲天堂岛国片| 国产99久久久国产精品成人免费| 亚洲成成品网站| 色诱av手机版| 久久wwww| 日韩欧美一二三四区| 午夜xxxxx| 国产一区二区三区亚洲综合| 欧美日韩国产天堂| 精品亚洲一区二区三区四区| 日本欧美韩国| 在线观看亚洲专区| 国产天堂在线播放| 国产激情欧美| 欧美精品视频www在线观看 | 国产l精品国产亚洲区久久| 青春草免费在线视频| 亚洲精品中文在线观看| 成人资源av| 国产肥老妇视频| 国产盗摄视频一区二区三区| 91久久精品一区二区别| 性猛交xxxx乱大交孕妇印度| 国产很黄免费观看久久| 国产精品久久久久久免费观看| 成 人 免费 黄 色| av在线播放一区二区三区| 精品久久久久亚洲| 毛片免费在线播放| 国产精品狼人久久影院观看方式| 一区二区不卡在线视频 午夜欧美不卡' | 国产剧情av在线播放| 精品久久久久久中文字幕一区奶水| 欧美日本视频在线| 黄频视频在线观看| 中文字幕伦理免费在线视频 | 日韩不卡中文字幕| 精品无码国产污污污免费网站 | 91在线看国产| 欧美日韩精品免费观看| 欧美激情黑人| 亚洲一区二区视频在线| 妺妺窝人体色www在线小说| 成人在线二区| 亚洲色图在线看| 国产欧美日韩小视频| 国产免费不卡| 欧美日本一区二区三区| 国产伦精品一区二区三区精品| 亚洲国产网址| 久久综合五月天| 国产免费av一区二区| 免费一级片91| 国产乱码精品一区二区三区卡| 你懂的在线看| 樱桃国产成人精品视频| 成人在线观看黄| 国内不卡的一区二区三区中文字幕| 亚洲第一免费播放区| 91精品久久久久久久久久久久| 亚洲九九在线| 日本国产欧美一区二区三区| 久久亚洲成人av| 日韩精品欧美精品| 国产精品国产精品国产专区蜜臀ah| 欧美色图另类| 一区二区高清在线| 日本人视频jizz页码69| 国产精品男女| 久久久精品日本| 九九精品免费视频| 国产宾馆实践打屁股91| 婷婷四月色综合| 黄色污网站在线观看| 91精品在线麻豆| 免费看污片的网站| 国产精品久久久免费 | 国产精品久久久久久久久毛片| 成人毛片在线观看| 国产精品jizz视频| av女优在线| 欧美色欧美亚洲高清在线视频| 免费在线看黄色片| 五月天色综合| 一夜七次郎国产精品亚洲| 五月天婷婷丁香| 国产一区二区三区免费在线观看| 视频一区亚洲| 欧美日韩美女| 亚洲精品视频二区| 中文字幕在线字幕中文| 国产成人aaa| 激情视频小说图片| 岛国一区二区| 原创国产精品91| 国产91精品看黄网站在线观看| 久久久久中文| 久久草视频在线看| aa国产成人| 色婷婷精品大在线视频 | 久久青草国产手机看片福利盒子| 99在线免费视频观看| 日韩在线视频一区二区三区| 久久综合国产精品台湾中文娱乐网| 在线观看国产精品入口男同| 国产一区二区三区久久久| 亚洲免费久久| 日韩成人一区| 欧美成人免费在线视频| 99热这里只有精品在线| 夜夜嗨av一区二区三区| 精人妻一区二区三区| 亚洲无线视频| 国产一区二区中文字幕免费看| 国模精品视频| 亚洲欧美日韩高清| 人人干在线观看| 久久99国产精品尤物| 中文字幕欧美日韩一区二区三区| 久久爱.com| 美女少妇精品视频| 亚洲第一视频在线播放| 午夜精品福利一区二区蜜股av | 欧美美女在线直播| 91wwwcom在线观看| 黄上黄在线观看| 欧美三级日韩在线| 破处女黄色一级片| 成人高清免费观看| 18禁男女爽爽爽午夜网站免费| 精品一区不卡| 91精品视频免费看| 精灵使的剑舞无删减版在线观看| 欧美精品一区二| 在线观看日本网站| 亚洲欧美综合网| 岛国精品一区二区三区| 麻豆亚洲精品| 中文字幕中文字幕在线中心一区| 日韩中文字幕视频网| 97视频免费在线看| 在线视频二区| 亚洲成色777777在线观看影院| 欧美特黄aaaaaa| 国产精品久久国产精麻豆99网站| 韩国一区二区三区四区| 香蕉久久a毛片| 青青草原国产免费| 日韩精品亚洲aⅴ在线影院| 久久亚洲综合国产精品99麻豆精品福利| av中文字幕在线免费观看| 亚洲成人在线免费| 五月天精品在线| 成人激情av网| 17c国产在线| 亚洲精品国产日韩| 一区二区三区四区久久| 牲欧美videos精品| 91成人免费视频| 香蕉视频亚洲一级| 欧美高跟鞋交xxxxhd| 国产又爽又黄免费软件| 婷婷一区二区三区| 成人在线观看免费完整| 久久精品在线观看| 久久性爱视频网站| 国精产品一区一区三区mba桃花 | 亚洲成人精品电影在线观看| 91九色鹿精品国产综合久久香蕉| 亚洲欧美国产制服动漫| av天堂一区二区三区| 在线精品亚洲一区二区不卡| 久久精品欧美一区二区| 亚洲欧洲三级电影| 在线观看日本中文字幕| 波多野结衣中文字幕一区二区三区| 岛国毛片在线播放| 久久欧美肥婆一二区| 欧美 日韩 国产 高清| 欧美一区二区三区久久精品茉莉花 | 国产日韩欧美精品综合| 国产精品久久久久久在线观看| 久久国产麻豆精品| 国产偷人视频免费| 亚洲精品乱码| 真人抽搐一进一出视频| 亚洲女同中文字幕| 一区二区三区四区视频在线观看| 一个色免费成人影院| 国产欧美日韩综合一区在线观看 | 俺来俺也去www色在线观看| 久久精品中文字幕电影| 调教视频免费在线观看| 国产亚洲激情在线| 国产精品一区二区婷婷| 亚洲欧美中文在线视频| 水莓100国产免费av在线播放| 舔着乳尖日韩一区| 久久国产在线视频| 亚洲一级二级三级| 国产极品在线播放| 午夜欧美视频在线观看| 精品一区在线视频| 亚洲h在线观看| 国产无遮挡又黄又爽| 亚洲一区二区四区蜜桃| 日韩女优在线观看| 精品久久久久久久久国产字幕| 日韩乱码人妻无码中文字幕| 欧美日韩国产激情| 中文字幕黄色片| 欧美三级一区二区| 99在线精品视频免费观看20| 欧美成人vr18sexvr| 蜜桃久久一区二区三区| 亚洲国产精品小视频| 手机在线不卡av| 欧美日韩aaaaa| 国产精品高潮呻吟av| 欧美一区二区成人6969| 性中国xxx极品hd| 亚洲高清免费观看高清完整版| 色婷婷激情五月| 亚洲人在线视频| aaa在线观看| 九九热这里只有在线精品视| 久草在线资源站资源站| 日本精品va在线观看| 日韩精品毛片| 欧美成人黄色小视频| 涩涩网在线视频| 国产精品毛片a∨一区二区三区|国| 91成人小视频| 国产成人精品在线播放| 精品久久福利| av一区观看| 成人午夜888| 国产亚洲精品美女久久久m| 蜜臀av免费一区二区三区| 亚洲激情图片| 黄色免费成人| 亚洲精品一二三四五区| 国产另类ts人妖一区二区| 黄色录像a级片| 国产精品久久久99| 亚洲 欧美 视频| 欧美人妇做爰xxxⅹ性高电影| 亚洲欧美另类日韩| 在线观看欧美日韩| ****av在线网毛片| 国产美女高潮久久白浆| 欧美福利在线播放网址导航| 中文字幕一区二区三区乱码| 亚洲精品极品| 四虎国产精品永久免费观看视频| 91在线免费播放| 成人观看免费视频| 亚洲欧美日韩国产成人精品影院 | 久久久精品人妻无码专区| 国产不卡一区视频| 少妇无套高潮一二三区| 亚洲风情在线资源站| 一区二区三区免费在线| 日韩精品在线免费| 欧美人与动牲性行为| 国产精品日日做人人爱| 欧美三级午夜理伦三级在线观看 | 亚洲免费激情| 日本黄色www| 中文字幕一区二区三区色视频 | 4438x成人网全国最大| 国产精品美女999| 猛男gaygay欧美视频| www成人免费| 精品亚洲porn| 在线观看日本中文字幕| 欧美日韩国产黄| 刘玥91精选国产在线观看| 精品国产欧美一区二区五十路| 欧美理论影院| 精品欧美一区二区在线观看视频| 欧美va亚洲va日韩∨a综合色| 中文字幕永久有效| 欧美激情一区二区三区四区| 男人天堂中文字幕| 欧美不卡一区二区三区四区| 国产精品剧情一区二区在线观看| 九九精品视频在线| 欧美成人xxxx| 亚欧精品在线| 日韩电影免费在线| 亚洲a v网站| 日本乱人伦aⅴ精品| 日本午夜在线视频| 奇米一区二区三区四区久久| 欧美黄色录像| 免费在线观看亚洲视频 | 91麻豆精品久久久久蜜臀| av在线中文| 国产欧美精品va在线观看| 日韩欧美网址| 亚洲一区二区三区四区五区| 中日韩免费视频中文字幕| 亚洲一区中文字幕永久在线| 最近2019中文字幕一页二页 | 国产精品久久久久久久av| 91激情在线视频| 爱爱爱免费视频在线观看| 国产精品狼人色视频一区| 日韩在线观看一区 | 亚洲天堂av在线免费| 都市激情综合| 五月天久久狠狠| 久久99精品一区二区三区| 天天看天天摸天天操| 欧美一区二区三区人| 激情在线视频播放| 国模一区二区三区私拍视频| 一本色道久久综合亚洲精品不卡| 成人精品在线观看视频| 欧美午夜在线一二页| 看女生喷水的网站在线观看| 亚洲精品免费av| 亚洲片区在线| 国产又大又粗又爽的毛片| 欧美日本不卡视频| 羞羞视频在线免费国产| 国产精品18久久久久久首页狼| 精品美女久久| 中文字幕第一页在线视频| 一区二区三区视频在线看| 天天操天天射天天舔| 国产精品成人播放| 亚洲欧美网站在线观看| 少妇户外露出[11p]| 欧美视频自拍偷拍| 污视频在线看网站| 日本公妇乱淫免费视频一区三区| 麻豆极品一区二区三区| 久久久久成人片免费观看蜜芽| 亚洲老头老太hd| 在线成人免费| 国产成人无码a区在线观看视频| 欧美国产精品一区二区| 国产福利第一视频| 日韩av免费网站| 午夜激情一区| 51妺嘿嘿午夜福利| 精品国产百合女同互慰| 欧美三区四区| 欧美大黑帍在线播放| 国产蜜臀av在线一区二区三区| а√天堂资源在线| 国产精品午夜视频| 国产精品视频久久一区| 国产午夜精品理论片在线| 精品偷拍各种wc美女嘘嘘|