99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

圖編輯系統(tǒng)設(shè)計指南:從數(shù)據(jù)模型到布局與性能的工程實踐

圖編輯系統(tǒng)設(shè)計指南:從數(shù)據(jù)模型到布局與性能的工程實踐 1. 為什么我會開始認(rèn)真思考 diagram-design 這件事先坦白一個背景我做的很多項目都需要畫圖——架構(gòu)圖、流程圖、時序圖、拓?fù)鋱D、ER 圖不一而足。早年沒太把這件事當(dāng)回事腦子里有個大概就開始堆代碼今天用某個在線工具拖一拖明天用另外一款軟件補一補后天發(fā)現(xiàn)某個模塊邏輯盤不清干脆 PPT 畫個示意就丟給下游。結(jié)果就是圖與圖之間風(fēng)格混亂、坐標(biāo)系不統(tǒng)一、數(shù)據(jù)模型對不上一個圖換一個人維護就徹底沒法看了。后來做了一個以“圖”為核心的跨平臺系統(tǒng)才真正把 diagram design 當(dāng)作一個嚴(yán)肅工程問題來看待。diagram-design 這個標(biāo)題表面看是“圖表設(shè)計”但做過的朋友應(yīng)該都能感受得到真正難的從來不是“畫圖”這個動作而是怎么把業(yè)務(wù)結(jié)構(gòu)拆解成節(jié)點、邊、分組、布局和交互這套模型再在這套模型之上做出可擴展、可維護、性能還過得去的渲染方案。畫一個靜態(tài)圖誰都會畫一套可以編輯、自動布局、實時聯(lián)動、支持大數(shù)據(jù)量的圖形系統(tǒng)那就是另一回事了。這篇內(nèi)容適合誰如果你正在做可視化編輯器、流程圖引擎、拓?fù)鋱D平臺、數(shù)據(jù)血緣圖或者只是被“項目里上百個圖形節(jié)點怎么管理”這件事折磨這篇文章應(yīng)該能提供一個從我有思路到落到工程實現(xiàn)的完整剖面。我會聊技術(shù)選型、數(shù)據(jù)建模、布局算法、交互與渲染的取舍也會把我在實際項目里踩過的一些坑直接攤開來講。不會有太多玄學(xué)盡量每一個結(jié)論都能對應(yīng)到實際代碼和真實場景。2. 先用一張“圖”拆解 diagram-design 的問題域很多人拿到“做一個圖表設(shè)計系統(tǒng)”的需求第一反應(yīng)是去找渲染庫這是順序錯了。渲染是整個鏈路里最末端的東西前面還有數(shù)據(jù)模型、布局邏輯和交互協(xié)議。如果這三層不先想明白哪怕選了再強的渲染引擎后面也會被各種臨時需求扯得七零八落。2.1 圖的本質(zhì)節(jié)點、邊、端口、分組與畫布把任意一張圖拆到底核心元素就這兩類節(jié)點和邊。但真實業(yè)務(wù)里光有這兩類遠遠不夠。以流程圖為例節(jié)點可能是“開始”“結(jié)束”“處理步驟”“判斷分支”邊是帶方向的箭頭但判斷分支的邊上得帶標(biāo)簽比如“是”和“否”。以網(wǎng)絡(luò)拓?fù)鋱D為例節(jié)點是服務(wù)器和交換機邊是鏈路但鏈路上可能有多條虛擬連接連線的語義遠比箭頭復(fù)雜。以 ER 圖為例節(jié)點是實體表邊是關(guān)系但關(guān)系有一對多、多對多之分邊上還需要標(biāo)注主外鍵字段。所以在設(shè)計數(shù)據(jù)模型的時候我建議一開始就把這幾類基礎(chǔ)設(shè)施建好節(jié)點Node坐標(biāo)、尺寸、類型、樣式、業(yè)務(wù)數(shù)據(jù)掛載點。端口Port節(jié)點上用于連線的錨點決定連線從哪個位置引出。邊Edge源端口與目標(biāo)端口、路徑點、箭頭樣式、線型、標(biāo)簽。分組Group用于表達容器關(guān)系比如泳道、子圖、分組框。畫布Canvas全局變換信息、縮放比例、可視區(qū)域、網(wǎng)格設(shè)置。如果項目里一開始就接受“邊只連接節(jié)點、不連接端口”這種簡化模型后面做節(jié)點拖動、邊跟隨、錨點吸附時會付出大量返工成本。我的經(jīng)驗是寧可第一版把端口模型做上去哪怕界面層暫時隱藏端口也比后續(xù)硬塞進一個不支持的模型要省力得多。2.2 從“畫一張圖”到“圖系統(tǒng)”跨度在哪里“畫一張圖”是單次行為畫完就結(jié)束信息不流動。而圖系統(tǒng)要考慮的是持續(xù)的編輯、序列化、數(shù)據(jù)驅(qū)動更新、多人協(xié)作甚至版本管理。這里有一個容易被低估的復(fù)雜度來源圖的序列化格式。如果只是想畫個靜態(tài)效果把節(jié)點坐標(biāo)和邊路徑直接寫進 JSON 就夠了。可一旦引入自動布局坐標(biāo)就成了派生數(shù)據(jù)而不是源數(shù)據(jù)——你存的是圖的拓?fù)浣Y(jié)構(gòu)坐標(biāo)是布局引擎算出來的。這時候若還把坐標(biāo)當(dāng)成第一公民寫死自動布局和手動調(diào)整之間就會天天打架。我后來采用的方案是源數(shù)據(jù)只保存節(jié)點、邊、端口的連接關(guān)系和業(yè)務(wù)字段坐標(biāo)則作為一個可選的“用戶覆蓋層”保存。布局引擎產(chǎn)出的坐標(biāo)寫入覆蓋層手動微調(diào)也寫入覆蓋層而拓?fù)浔旧硎冀K是干凈的結(jié)構(gòu)化數(shù)據(jù)。這套設(shè)計的直接收益是后續(xù)加新布局算法、做子圖復(fù)用、做圖形模板都不需要動根基。3. 技術(shù)選型的底層邏輯老牌庫就一定省心嗎圖表領(lǐng)域可選的技術(shù)棧其實不多但每個方案都各有各的脾氣。我把主流路線梳理了一遍重點不是“誰最強”而是“誰更適合作為自研圖系統(tǒng)的基礎(chǔ)”。3.1 三條主流路線的對比市面上做 diagram 相關(guān)工具底層渲染路線大抵分三類一是基于 SVG 的方案。代表庫包括老牌的 Raphael 和后來的一些封裝庫。SVG 的優(yōu)點在于 DOM 集成度高事件處理天然樣式可以用 CSS 控制做小型和中型圖非常順手。缺點是節(jié)點數(shù)量一旦上千DOM 節(jié)點數(shù)量會成為明顯的性能瓶頸拖拽縮放時也會感覺跟手度不夠。二是基于 Canvas 的方案。一次繪制、整體渲染性能上限比 SVG 高很多適合節(jié)點數(shù)多、交互相對簡單的場景比如純展示類拓?fù)?。缺點是事件命中檢測要自己做文字換行、樣式定制都得模擬一套 UI 體系開發(fā)成本明顯上去了。三是基于 WebGL 的方案。這是真正的重型武器性能天花板最高能做海量節(jié)點和復(fù)雜動效但開發(fā)門檻也最高普通圖系統(tǒng)上屬于殺雞用牛刀。如果項目里沒有“幾萬個節(jié)點還要流暢漫游”這類極端需求建議不要一上來就碰。3.2 我最終確定的自研組合開頭提到的那個跨平臺系統(tǒng)節(jié)點規(guī)模常規(guī)在幾百到幾千這個區(qū)間同時要求支持用戶交互編輯、拖拽、縮放、框選還要能導(dǎo)入導(dǎo)出多種格式。我最后選的技術(shù)組合是基于 SVG 自研核心渲染引擎配合虛擬化渲染思路來做性能兜底。一句話總結(jié)就是先選對工具車再考慮給車上裝什么樣的引擎。為什么不是 Canvas因為在編輯型圖系統(tǒng)里“精細到每個節(jié)點、每條邊的交互”是核心訴求。SVG 天然就有獨立 DOM 節(jié)點來做事件綁定框選、拖拽、命中檢測這些都順手很多。Canvas 要自己實現(xiàn)的交互層工作量幾乎是 SVG 方案的兩三倍。為什么不是直接套某個大而全的現(xiàn)成庫因為這個項目需要深度定制自定義節(jié)點形狀、自定義端口規(guī)則、自定義自動布局算法、特定的數(shù)據(jù)格式對接。成熟商業(yè)庫的封裝層再厚到了這一步也會成為障礙。與其花大力氣繞開別人的封裝不如在底層之上只保留少量惰性封裝。補充一個表方便你看對比方案交互開發(fā)成本性能上限定制自由度適合場景純 SVG 自研低中配合優(yōu)化手段可提升高中量級編輯型圖系統(tǒng)Canvas 自研高高高展示型、超大量節(jié)點現(xiàn)成 Vue/React 圖庫低中低快速交付、標(biāo)準(zhǔn)圖型WebGL 自研很高極高很高極端大規(guī)模場景這套選型落地的過程中我也有一些心得不要追求“一步到位的全能力框架”先做一個只支持有限節(jié)點類型、有限交互的版本跑通鏈路再逐步開放能力。圖表系統(tǒng)的復(fù)雜度是螺旋上升的最怕一開始就引入大量抽象概念結(jié)果自己先被抽象困住了。4. 數(shù)據(jù)模型先行如何把業(yè)務(wù)“翻譯”成圖結(jié)構(gòu)選定技術(shù)棧之后我做的第一件事不是畫界面而是定數(shù)據(jù)模型。這個階段多花一周后面少花一個月。4.1 核心實體的最小字段集我把最初的 TypeScript 類型定義精簡成下面這個層次這是整個系統(tǒng)最關(guān)鍵的代碼片段沒有之一interface DiagramNode { id: string; type: string; // 節(jié)點類型如 process, start, end x: number; y: number; width: number; height: number; ports: Port[]; // 端口列表 data: Recordstring, any; // 業(yè)務(wù)數(shù)據(jù)掛載點 groupId?: string; // 所屬分組 } interface Port { id: string; nodeId: string; side: top | right | bottom | left; // 所在方位 index?: number; // 同一側(cè)多個端口時的順序 } interface Edge { id: string; source: PortRef; // { nodeId, portId } target: PortRef; points?: Point[]; // 經(jīng)過的關(guān)鍵路徑點 label?: string; style?: EdgeStyle; }這里有兩個容易被忽視的設(shè)計點第一個是Port獨立成實體。連線不是“從這個節(jié)點中心到那個節(jié)點中心”而是“從某節(jié)點的一個端口到另一節(jié)點的一個端口”。在這個模型下節(jié)點拖走時邊的端點能自動跟隨到正確位置多端口節(jié)點也能區(qū)分“這根線究竟連哪個插孔”。第二個是節(jié)點的data字段它專門用來掛載業(yè)務(wù)數(shù)據(jù)。圖系統(tǒng)本身不關(guān)心業(yè)務(wù)字段是啥但交互層、校驗層、后端同步層都需要一個統(tǒng)一入口來讀寫。把業(yè)務(wù)數(shù)據(jù)和圖形數(shù)據(jù)混在一個平級字段里短期省事長期必亂。4.2 序列化格式的版本兼容設(shè)計圖數(shù)據(jù)一定會經(jīng)歷版本迭代。今天你的圖里有節(jié)點、邊、端口明天可能就要加“子圖”或者“泳道”后天可能又要加“聚合節(jié)點”。如果在序列化結(jié)構(gòu)里不做版本字段和兼容策略老數(shù)據(jù)怎么遷移將成為一個大麻煩。我用的做法是給所有持久化數(shù)據(jù)加一個schemaVersion字段同時維護一個遷移函數(shù)鏈。每次數(shù)據(jù)結(jié)構(gòu)變化就新增一個遷移函數(shù)而不是直接改舊數(shù)據(jù)的讀取邏輯。加載時如果發(fā)現(xiàn)版本號低于當(dāng)前版本就依次執(zhí)行遷移函數(shù)把舊數(shù)據(jù)升級到最新格式。這套思路其實就是軟件工程里的數(shù)據(jù)庫遷移思路搬到前端圖數(shù)據(jù)上一樣適用。具體遷移函數(shù)示例const migrations: Recordnumber, (oldData: any) any { 1: (data) { // 版本1升級到版本2為每個節(jié)點補充空數(shù)組 ports return { ...data, nodes: data.nodes.map((n: any) ({ ...n, ports: [], groupId: undefined })) }; }, 2: (data) { // 版本2升級到版本3edge 從 node 引用改為 port 引用 return { ...data, edges: data.edges.map((e: any) ({ ...e, source: { nodeId: e.source, portId: e.sourcePort }, target: { nodeId: e.target, portId: e.targetPort } })) }; } }; function upgrade(data: any): any { let current data; while (current.schemaVersion LATEST_VERSION) { const next current.schemaVersion 1; current migrations[next](current); current.schemaVersion next; } return current; }如果沒有這套機制第一版上線后一改數(shù)據(jù)格式用戶手里的圖就打不開了那是災(zāi)難級事故。我現(xiàn)在對這個事情敏感度很高凡是能持久化的結(jié)構(gòu)必須有版本標(biāo)識、必須有遷移路徑、必須有新舊兼容的至少一個迭代容錯周期。4.3 業(yè)務(wù)語義與視覺表達的邊界圖系統(tǒng)里最容易出問題的地方是把視覺表達直接當(dāng)成業(yè)務(wù)語義存儲。比如說某個節(jié)點在業(yè)務(wù)上屬于“已下線”狀態(tài)你可能會想給它渲染成灰色然后在數(shù)據(jù)模型里也記一個color: gray。短期看著沒問題可一旦業(yè)務(wù)規(guī)則變成“已下線”要顯示成紅色你就得去改全量數(shù)據(jù)而不是只改一套配置。我的做法是數(shù)據(jù)模型里存穩(wěn)定的業(yè)務(wù)狀態(tài)字段比如status: online | offline視覺層統(tǒng)一維護一份“狀態(tài)到樣式的映射表”。當(dāng)多個節(jié)點共用同一種視覺規(guī)則時把樣式注冊成可復(fù)用的主題規(guī)則而不是散布在各節(jié)點數(shù)據(jù)里。用一句話概括就是數(shù)據(jù)存事實樣式存映射規(guī)則集中在主題層。這個原則同樣適用于邊的類型。業(yè)務(wù)里的“依賴關(guān)系”和“調(diào)用關(guān)系”在圖上可能只是顏色和線型不同但在數(shù)據(jù)模型里必須是兩個不同的edgeType。如果只依賴顏色區(qū)分后續(xù)做數(shù)據(jù)導(dǎo)出、權(quán)限控制、語義分析的時候就會缺失關(guān)鍵信息。5. 自動布局決定圖表可讀性的隱藏引擎如果說數(shù)據(jù)模型是圖系統(tǒng)的骨架那自動布局就是它的神經(jīng)系統(tǒng)。理想的布局算法能把一團亂麻的拓?fù)渥詣诱沓扇祟愰喿x時覺得“順眼”的結(jié)構(gòu)。順眼是個主觀感受但底層規(guī)律其實非常穩(wěn)定減少交叉邊、保持層級方向一致、同類節(jié)點對齊、連線盡量短。5.1 分層布局、力導(dǎo)向布局和正交布局的應(yīng)用邊界目前開源的布局算法核心就那幾類選錯了應(yīng)用場景體驗會斷崖式下跌。分層布局的核心思路是先對圖做拓?fù)渑判虬压?jié)點按層級排開再在每一層內(nèi)部調(diào)整順序以降低邊交叉。流程圖、狀態(tài)機、依賴關(guān)系圖都適合分層布局因為它天然有“從上往下、從左往右”的閱讀方向感。實際項目里大多數(shù)業(yè)務(wù)圖的默認(rèn)布局我都會優(yōu)先考慮分層布局。力導(dǎo)向布局模擬的是物理模型節(jié)點之間互相排斥、邊就像彈簧互相拉引迭代若干次后達到穩(wěn)定狀態(tài)。這種布局適合沒有明確方向感的圖比如社交網(wǎng)絡(luò)關(guān)系、系統(tǒng)模塊親密度圖。優(yōu)點是不需要對圖做任何結(jié)構(gòu)假設(shè)缺點是結(jié)果帶有隨機性同一個圖布局兩遍節(jié)點位置可能完全不一樣。對經(jīng)常需要“復(fù)現(xiàn)同樣視覺效果”的場景這是個大忌。正交布局則更貼近電路圖和建筑平面圖的風(fēng)格所有線段都走水平或垂直方向折彎處用直角。ER 圖、微服務(wù)調(diào)用鏈這種強調(diào)連線清晰度的場景正交布局非常有用不過代價是路徑計算的復(fù)雜度明顯更高。實際項目中我一般這樣分配有天然層級關(guān)系的用分層布局不分層但強調(diào)聚類關(guān)系的用力導(dǎo)向需要嚴(yán)謹(jǐn)連線的圖允許用戶在自動布局之后手動微調(diào)路徑點而不是強行全自動。5.2 我基于 dagre 的二次封裝與定制業(yè)界做分層布局dagre 是個繞不開的庫。它實現(xiàn)的是經(jīng)典的 Sugiyama 分層算法框架輸入一個圖結(jié)構(gòu)輸出帶坐標(biāo)的布局結(jié)果。但直接用 dagre 做業(yè)務(wù)系統(tǒng)還是有幾個很別扭的地方。第一個問題dagre 不知道你的節(jié)點尺寸它默認(rèn)把節(jié)點當(dāng)成等寬高的矩形。真實場景中節(jié)點寬度差異很大有的節(jié)點要放圖標(biāo)有的節(jié)點是一大段文本。所以我在封裝時做了一步“先按默認(rèn)尺寸布局再按實際尺寸調(diào)整層級內(nèi)對齊”大致思路如下function layeredLayout(graph: GraphModel, options: LayoutOptions) { // 第一遍預(yù)估尺寸跑 dagre 拿到相對層級與順序 const preliminary dagre.graphlib.Graph(); preliminary.setGraph({ rankdir: options.rankdir }); graph.nodes.forEach(node { preliminary.setNode(node.id, { width: node.width || DEFAULT_WIDTH, height: node.height || DEFAULT_HEIGHT }); }); graph.edges.forEach(edge { preliminary.setEdge(edge.source.nodeId, edge.target.nodeId); }); dagre.layout(preliminary); // 第二遍按實際尺寸做層內(nèi)對齊兼顧同一層節(jié)點的中心線對齊 const layers groupByRank(preliminary, graph); const result: Recordstring, { x: number; y: number } {}; layers.forEach((layer, layerIndex) { const maxHeight Math.max(...layer.map(n graph.node(n).height)); layer.forEach((nodeId, index) { const node graph.node(nodeId); result[nodeId] { x: layerOffset(nodeId, index, layers), y: layerIndex * (maxHeight options.levelGap) }; }); }); return result; }第二個問題dagre 輸出的布局沒有考慮端口方位。它默認(rèn)邊從節(jié)點中心連到節(jié)點中心可真實圖上連線應(yīng)該有明確的出口和入口方向。我的做法是在布局階段先以節(jié)點中心坐標(biāo)做整體排布排完后再根據(jù)邊的相對方位自動推導(dǎo)端口方向這樣既保留了 dagre 的整體結(jié)構(gòu)穩(wěn)定性又讓局部的連線看起來更自然。第三個讓我折騰了一陣的問題節(jié)點寬度差異導(dǎo)致同層節(jié)點參差不齊。比如同一層的三個節(jié)點一個 300px 寬兩個 120px 寬如果只是簡單地把它們擠在一行大節(jié)點會頂著左右兩邊小節(jié)點周圍留出大片空白。最終我采用“層內(nèi)網(wǎng)格居中”策略把每層寬度統(tǒng)一拉伸到該層最大節(jié)點的寬度小節(jié)點在該列內(nèi)水平居中。視覺效果會整齊很多。5.3 布局重計算的觸發(fā)策略布局算法有個常見的性能陷阱用戶只是拖動了某一個節(jié)點整個圖都重新布局了一遍。這會讓用戶感覺到“圖不聽話”因為非被拖動的節(jié)點也亂跳了。我調(diào)參后的觸發(fā)策略是節(jié)點拖動過程中只更新被拖動節(jié)點及其直接相連邊的路徑不做全局重排。節(jié)點拖動結(jié)束標(biāo)記該節(jié)點坐標(biāo)為用戶覆蓋后續(xù)自動布局跳過它。手動觸發(fā)自動布局比如點擊“重新布局”按鈕執(zhí)行全圖重排此時清除所有手動覆蓋信息。圖結(jié)構(gòu)變化新增/刪除節(jié)點、邊以增量方式打補丁優(yōu)先保持已有節(jié)點位置不變讓新節(jié)點在旁邊“長出來”只有在結(jié)構(gòu)變化比例過大時才主動做全量重排。這套策略的核心思想是自動布局要尊重用戶的每一次手動調(diào)整只有在用戶明確要求時才能大動干戈。否則光是一個“拖完節(jié)點又彈回去”的問題就能把用戶逼瘋。6. 交互與渲染的細節(jié)工程拖拽、縮放與路徑重算圖和普通 UI 組件最大的不同在于它面對的是一塊無邊際的虛擬畫布。所有交互計算都要在圖坐標(biāo)和屏幕坐標(biāo)之間做轉(zhuǎn)換這就是整個交互層的數(shù)學(xué)地基。6.1 坐標(biāo)變換與縮放系數(shù)管理假設(shè)畫布有一個全局變換縮放系數(shù)scale平移偏移量tx、ty。那么屏幕坐標(biāo)和邏輯坐標(biāo)之間的換算關(guān)系就是screenX logicX * scale tx screenY logicY * scale ty反推邏輯坐標(biāo)logicX (screenX - tx) / scale logicY (screenY - ty) / scale這套公式本身不復(fù)雜但工程上有幾個細節(jié)容易出問題。第一個是鼠標(biāo)滾輪縮放的中心點。如果鼠標(biāo)停在畫布某處滾輪縮放之后鼠標(biāo)下的那個邏輯坐標(biāo)點應(yīng)該在屏幕位置保持不變。很多初版實現(xiàn)都沒做這個校正結(jié)果就是縮放時圖總是往左上角縮或者上下左右亂飄。校正公式是把光標(biāo)處的邏輯坐標(biāo)作為錨點先換算縮放前后的偏移量差再補償?shù)絫x、ty上。第二個是編輯狀態(tài)下的坐標(biāo)精度。當(dāng)縮放系數(shù)特別大比如放大到 200%同一個邏輯坐標(biāo)在不同幀之間小數(shù)位抖動會導(dǎo)致節(jié)點邊緣不停閃爍。我的做法是渲染層統(tǒng)一用整數(shù)化的邏輯坐標(biāo)避免累積誤差。6.2 連線路徑的自動規(guī)避與折線計算邊是圖系統(tǒng)中最“難畫”的元素因為它的路徑點需要繞過節(jié)點還需要在方向變化處畫成直角折線。直角折線計算的標(biāo)準(zhǔn)思路是如果源端口和目標(biāo)端口在同一水平線就走一段水平線如果不在就要先出端口方向一段“引出線”再走正交線段連接。我用的是簡化版 A* 尋路算法作用范圍限制在包圍盒所在的局部區(qū)域。具體來說網(wǎng)格化源節(jié)點到目標(biāo)節(jié)點之間的矩形區(qū)域把其他節(jié)點當(dāng)成障礙物搜索一條從源端口到目標(biāo)端口的最短正交路徑。這個算法對少數(shù)連線場景表現(xiàn)很好但連線一旦密集比如上百條每根線都做獨立尋路會產(chǎn)生大量重疊和交叉這也是正交布局在復(fù)雜場景下比較難解決的問題。我采取的妥協(xié)方案是自動計算完路徑后再做一次基于熵的路徑平滑把共線的線路合并交叉情況用曲線過渡簡化視覺噪聲。效果上自動連線的“粗糙感”會明顯減輕雖然沒法做到完全零交叉但在千級節(jié)點規(guī)模的系統(tǒng)里已經(jīng)夠用。6.3 選中的反饋與編輯器的撤銷/重做圖編輯器里用戶對“選中”的反饋非常敏感。節(jié)點選中時會出現(xiàn)選中框邊選中時會出現(xiàn)路徑錨點同一時間可以框選多個對象。這個交互層其實藏著一個大坑撤銷/重做棧。圖編輯的撤銷和文本編輯的撤銷復(fù)雜度完全不在一個量級。光是把一個節(jié)點從 A 點拖到 B 點中間會經(jīng)過幾十次鼠標(biāo)移動事件如果不做合并撤銷棧會被幾十條“位置微調(diào)”記錄撐爆用戶按一次撤銷只能回退 1 像素體驗極其糟糕。我后來實現(xiàn)的是“命令模式 操作批次合并”連續(xù)同類型的變更比如連續(xù)拖拽、連續(xù)縮放、連續(xù)框選移動合并成一個撤銷記錄每次交互結(jié)束后才 push 進撤銷棧。像這樣class CommandStack { private stack: Command[] []; private batch: Command[] | null null; beginBatch() { this.batch []; } push(command: Command) { if (this.batch) { this.batch.push(command); } else { this.stack.push(command); } } endBatch() { if (this.batch this.batch.length 0) { this.stack.push(this.batch); } this.batch null; } undo() { const cmd this.stack.pop(); if (Array.isArray(cmd)) { cmd.reverse().forEach(c c.undo()); } else if (cmd) { cmd.undo(); } } }每次鼠標(biāo)按下時beginBatch()鼠標(biāo)松開時endBatch()整個拖拽過程只留下一個可撤銷步驟用戶按 CtrlZ 時能夠一次回到拖拽前狀態(tài)。這個設(shè)計雖然代碼行數(shù)不多但對編輯類工具的使用體驗提升是立竿見影的。7. 性能優(yōu)化的實戰(zhàn)路徑當(dāng)棱角開始穿透 SVG 的天花板SVG 的上限在幾千個節(jié)點時就會開始顯形這個數(shù)字聽起來好像很夠用可真到了流程圖編輯場景一個主節(jié)點掛幾十個子節(jié)點再疊加編輯緩存和歷史記錄內(nèi)存占用很快會飆升。我經(jīng)歷過的性能拐點很明確節(jié)點數(shù)上到 2000 左右拖拽開始卡5000 左右直接沒法互動。所以性能優(yōu)化不是可選項是必選項。7.1 可視區(qū)裁剪是第一優(yōu)先級的優(yōu)化圖表畫布是個無邊際的世界但用戶眼睛能看到的區(qū)域其實很小。不做可視區(qū)裁剪等于把整個城市的地圖一次性畫出來而用戶只盯著一個街區(qū)。實現(xiàn)思路是維護一個可視矩形viewBounds遍歷節(jié)點時只渲染與viewBounds有交集的節(jié)點對完全在可視區(qū)外的節(jié)點直接跳過 DOM 創(chuàng)建。邊的渲染判斷稍微復(fù)雜一些因為一條邊的兩個端點可能都在可視區(qū)外但路徑中途穿過可視區(qū)。所以邊不能用“兩端是否在可視區(qū)”來判斷需要判斷折線線段與viewBounds是否相交。7.2 分層渲染靜態(tài)層與交互層分離很多圖表卡頓的根源在于靜態(tài)展示的圖形和用戶正在拖拽的節(jié)點混在同一個渲染層級每次交互都導(dǎo)致全量重繪。我采用的方案是分層底層靜態(tài)背景網(wǎng)格線、大節(jié)點、固定樣式元素只在畫布變換結(jié)束或數(shù)據(jù)變更時重繪。中間層動態(tài)內(nèi)容節(jié)點和邊的渲染主體在拖拽、縮放時按需更新。頂層交互反饋層選中框、拖拽中的預(yù)覽路徑、臨時高亮每幀刷新但元素數(shù)量極少。TS 項目里對應(yīng)實現(xiàn)就是疊加多個g組操作時精準(zhǔn)定位到對應(yīng)層級的g而不是每次都重建整個畫布。7.3 批量更新原則與渲染節(jié)流節(jié)點數(shù)據(jù)變化是高頻事件如果每次變化都立即操作對應(yīng) DOM往往會造成無謂的性能開銷。我多做了一個隊列化更新機制把一批變化統(tǒng)一收集放到 requestAnimationFrame 的回調(diào)里一次處理。這樣在同一次交互內(nèi)的幾十次節(jié)點移動最終只觸發(fā)一次批量更新。類似的節(jié)流還用在了縮放事件上。滾輪事件在瀏覽器里頻率非常高如果每幀都去重算所有邊的路徑必然卡頓。我的做法是縮放過程中只更新畫布的 transform 和網(wǎng)格線等縮放停止約 150ms 無新事件后才重算邊上路徑點的寬度。視覺上無感性能上會有質(zhì)的提升。8. 一路摸爬滾打總結(jié)的 diagram-design 實用準(zhǔn)則最后把這段經(jīng)歷里最有復(fù)用價值的東西濃縮成幾條原則這些是我每次做圖系統(tǒng)時都會默念的清單。先定數(shù)據(jù)模型再選渲染庫。數(shù)據(jù)模型一旦定錯后續(xù)所有代碼都在給錯誤模型打補丁。節(jié)點、端口、邊、分組、畫布這五個實體齊全了再去接渲染層、布局算法和交互邏輯。自動布局和用戶手動調(diào)整的關(guān)系要趁早想清楚。我用“用戶覆蓋優(yōu)先、自動布局尊重覆蓋、用戶主動觸發(fā)才全量重排”這套策略極大避免了布局和手動的沖突。如果沒有這條策略圖系統(tǒng)會處于一種“永遠在跟用戶搶奪控制權(quán)”的狀態(tài)非常難受。序列化數(shù)據(jù)結(jié)構(gòu)必須帶版本號和遷移機制。好結(jié)構(gòu)是慢慢“長”出來的沒有誰第一版就能設(shè)計完美。允許數(shù)據(jù)模型演進但演進一定要有章法不能直接把舊數(shù)據(jù)處理邏輯撕了。圖系統(tǒng)的性能優(yōu)化以可視區(qū)裁剪為基底再疊加批量更新和分層渲染。這三板的收益在中小圖系統(tǒng)上已經(jīng)足夠真正需要 WebGL 的場景非常少不要過早引入重型技術(shù)。還有一個容易忽略的體驗細節(jié)圖系統(tǒng)的空狀態(tài)。用戶打開編輯器時畫布上什么都沒有此時至少要展示一張“引導(dǎo)浮層”告訴用戶從哪里開始創(chuàng)建節(jié)點、怎么連線、怎么切換布局。這個浮層成本極低但對新用戶的上手體驗幫助極大。很多圖系統(tǒng)做出來功能很強大但新用戶一打開就懵了很大原因是空狀態(tài)沒有設(shè)計過。我現(xiàn)在的習(xí)慣是每做一個 diagram 類項目都會先從數(shù)據(jù)和布局入手搭一個最小原型只支持一個正方形節(jié)點、一條邊、一次拖拽、一次縮放跑通全鏈路后再逐步加功能。這個最小原型的價值不在于功能而在于把坐標(biāo)系、批量更新、撤銷棧、序列化這些地基打牢。地基穩(wěn)了后面長出來的每一層功能才不至于傾覆。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
91激情五月开心| 先锋男人99资源| 婷婷亚洲色| 婷婷五月六月激情| 天天插天天日天天爽| 九热视频精品| Www.sesese丁香| 9l视频自拍九色9l视频自拍九色9l社区 | 天天爽夜夜爽夜夜爽精品| 亚洲欧美日韩另类| 久久九九Com| 久久久网站| 色丁香影院| 丁香六月婷婷综合色| 五月停停色| 婷婷无五月无码视频| 九九热视频精品| 五月婷婷开心综合| www天天爽| 插插干干干色| 婷婷五月综合激情小说| 婷婷综合成人五月天| 99久热| 无码色综合| 99色综合久久| 五月天成人在线| 久久新| 超碰人人妻| 久久国产一区二区三区| 夫妇交换刺激做爰| 色婷婷六月| 日本色五月| 色哟哟精品| 思思热精品在线视频| 这里只有精品在线播放| 久草xx性爱视频| 天天操夜夜夜拍拍拍| 狠狠干天天内射| 国产67194| 91在线视频综合| 九热av| 丁香六月婷婷色XXXX| 亚洲乱码日产精品BD| 亚洲激情综合| 欧美日韩欧美| 操97在线观看| 亚洲另类av| 国产永久一黄| 五月丁香精品| 久久五月天合网| 激情丁香婷婷五月天| 色婷婷色五月另类综合| WWW、日本色丁香、co m| 中文精品久久久久人妻不| 怕怕視頻| 五月婷婷丁香五月婷婷| 97色色色| 狠狠色婷婷| 色色五月婷| 9l视频自拍九色9l视频自拍九色9l社区 | AA片在线观看视频在线播放| 激情五月天色播| 五月丁香综合网| 色综合丁香| 97碰碰碰| 丁香香五月激情免费视频| 、激情六月天| 色色综合网络| 操碰91| 丁香九月激情| 青草视频在线播放| 国产精品人妻在线网址| 久久中文人妻系列| 婷婷五月18永久免费视频| 可以看的AV| 开心激情综合| 亚洲综合另类| 97热久久五月婷婷| 丁香五月婷婷色综合基地| 婷婷丁香五另类网站| www.sezonghe| 亚洲中文字幕网| 成人做爰A片免费看网站找不到了| 亚洲爆乳无码精品AAA片蜜桃| 亚洲欧美综合7777色亭亭| 大香蕉丁香| 无码人妻电影| 开心五月深爱五月丁香五月激情五月| 99九九精品| 国产精品18久久久| 桃色激情五月天| 激情小说五月天社区丁香| 婷婷久久国产视频| 亚洲综合成人网| 激情综合网亚洲色图| 成人婷婷五月| 色播五月网| 天堂伊人干| 99爱爱网| 开心五月深爱激情| 激情丁香五月婷婷| 操比激情五月综合| 婷婷六月色情| 开心婷婷五月| 激情久久 婷婷| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 精品乱码久久久久| 色九九九九| 色综合播放| 啪啪小说五月天| 97色色色色色| 狠狠色丁香婷婷久久综合| 中文人妻主播久久| 日韩成人综合网| 五月婷婷影视| 五月色无码| 亚洲在线综合| 日韩淑女人妻luan伦激情精品一区二| 日韩色情亚洲五月天婷婷| 欧美婷婷丁香五月社区| 人妻中文av| 激情涩涩网| 99爱视频在线观看| 黄色AAAAAAA| 精品无码色| 欧美天堂久久| 欧美乱码国产一级A片| 26uuu国产精品| 99久久九九| 久久爱综合| 丁香五月在线伊人| 开心激情五月天网| www.99久| 99久久综合网| 成人版视频在线观看| 风流少妇A片一区二区蜜桃 | 日本在线免费中文com.| 色五月丁香五月| 成人在线网站| 极品另类| 99久精品视频| 可以免费观看的AV| 男人天堂 久久| 狠狠色狠狠色综合日日91| 色播五月婷婷| 六月婷婷成人| 91综合在线| 99性视频| 激情四射五月天| 1024手机在线观看看片_日韩精品| 欧美成人五月天| 亚洲欧美日韩VIP| 五月情丁香色| 国产伦亲子伦亲子视频观看| 色婷婷六月精品| 日韩成人精品中文字幕| www.91有码.com| AAA久久| 色,激情五月天| 久99在线视频| 99婷婷| 97 A I色色| 色碰碰视频| 91九色国产在线| 大香蕉五月| 激情五月六月婷婷| 丁香婷婷色情| 激情六月丁香| 久久婷婷五月天激情四射| 国产在线自| 婷婷丁香18| 国产综合久久久777777| 综合久久婷婷| 婷婷五月亚洲激情| 无码成人AAAAA毛片AI换脸| 韩国情人在线电视剧免费观看高清版全集 | aaa丁香五月天| 欧美成人精品A片免费一区99| 玖玖爱伊人| 亚洲第一黄网| 免费色色色| 五月天丁香| 丁香八月综合激情| 天天艹| 色5月丁香婷婷| 色色五月天丁香婷婷| 五月丁香啪啪啪啪| 99热日本| 九九www| 综合久久97| 色综合色色| 91超级碰碰碰| 终合激情网| 亚洲乱码w在线观看| 97操视频| 国产五月婷| 91国产精品视频播放| 五月丁香综合网| 久热 91| 色综合色色| www.夜夜夜| 日本黄色三级片内射| 99热这里只有精品国产首页| 色欲天天综合网| 91九色精品熟女内射| A短视频免费在线观看| 婷婷十月丁香| 久久综合性| 91丨九色丨东北熟女| 婷婷五月天激情综合深爱激情| 日日噜噜久久婷婷五月天| 色色丁香婷婷综合| 99热这里只有免费| 久久99热这里只有精品首| av在线婷婷| 色色99| 热99这里只是精品| 成人在线观看一区| 日韩成人无码| 色色婷婷丁香| 五月婷婷婷| 欧美 日韩 成人在线| 中文字幕精品无码一区二区| 99热都是精品| 婷婷伊人五月天| 99热婷婷| 日亚二欧美| www.yw尤物| 色婷婷五月在线| 99re99热| 国产ava| 中文字幕日产A片在线看| 欧美婷婷精品激情| 思思re视频在线| 人妻久久婷婷| www.99热精品99.com| 99色在线| 91九色精品女同系列| 婷婷色五月色妇| 国产免费一区二区三州老师F1F1| 在线播放成人| 丁香五月婷婷图片综合| 狠狠色丁香| 色婷六月| 五月天成人在线视频网站| 婷婷五月天com| 夜夜骑夜夜撸| 99精在线| 婷婷六月情| 婷婷日| 久超超碰| 九九99男女视频在线观看| 少妇大叫太大太粗太爽了A片 | 99玖玖人人| 无码激情AAAAA片-区区| 丁香六月婷婷久久综合| 色九月婷婷| 天天爽免费视频| 色色色视频| 2017狠狠干| 99热九九九九| 久cao香蕉影院| 成人在线99| 亚洲无码yw| 99热亚洲| 九九热99视频在线| 欧美精品A片一区在线观看| 久99久视频精品| 99色| 久久在线视频免费观看| 少妇被下春药玩弄A片| 激情亚洲网| 性高潮久久久久久-九九九九九九九九九九热-成人AV | 9久久久久| www.99热这里精品| 极品人妻VideOssS人妻| 久久婷婷五月免费视频| 青草青青草| 亚洲丁香五月| 激情丁香五月天图片| 久久久aaa| 激情内射人妻1区2区3区| 久草热在线视频| 九月丁香| 综合色播| 色婷婷小说| 人妻少妇色综合| 高清无码网址| 国精产品一区一区三区免费视频| 亚洲亚洲人成综合网络| 9热超碰| 熟惀91九色在线| 国产毛片精品一区二区色欲黄A片| 国产成人精品一区二三区熟女在线| 九九热精品视频| 色婷婷久久综合中文久久一本| 婷婷久久网| 久久99综合| 五月天开心激情综合网| www.婷婷五月天| 六月婷婷激情| 婷婷激情综合色五月久久91| 五月婷婷婷综合网| 99久久综合| 夜夜操夜夜爽| 深爱婷婷丁香五月激情| 六月婷婷激情图片| 风流少妇A片一区二区蜜桃| 日韩av一区二区在线/日产精品久久久 | 天天做天天爱天天做| 伊人久久五月天综合| 国产偷人妻精品一区| 色婷婷激情| 亚洲AV人人操| 99精品偷自拍| 新激情综合| 激情性爱五月| 亚洲欧洲色色| 婷婷五月丁香综合人妻| 26UUU欧美激情一区二区| 成人AV在线网站| 天天天天干| 亚洲五月综合色播| 欧美va在线| 99精品久久久久| 色综合色| 五月丁香婷婷激情图片| 97色在线视频| 久久久人妻系列| 激情五月综合亚洲另类| 风流少妇A片一区二区蜜桃| 五月婷三级片| 99久re热视频精品98| 久婷婷久草| 久久久天天啊| 大学生高潮无套内谢视频| 久久月天堂| 91人人网| 五月丁香六月婷婷网站| 色中色综合| 日本婷婷激情四射中文字幕在线观看| 中文色婷婷| 5月色亭亭视频| 色欧洲| 久久久婷婷婷| 97精品自拍视频| 激情五月图| 婷婷五月天激情诱惑| 久综合网| 婷婷五月精品中文| 呦呦v线| 婷婷久久精品| 婷婷五月综合基地| 亚州激情网| 韩国天天婷婷| 久久婷婷七月丁香| 秋霞三级影视资源| 久久婷婷五月综合| 一区三区视频有限公司| 精品,99| 婷婷五月激情中文字幕| 99WWW免费视频| 婷婷伊人激情婷婷| 天天操天天日天天爱| 激情五月天色婷婷| 无码激情AAAAA片-区区| 婷婷五月天综合激情| 直接看的AV| 成人精品一区日本无码网 | 丁香五月六月婷婷殴美综合| 欧美日本日韩| 婷婷五月激情六月丁香| 色五月激情五月天| 9久视频| 深爱婷婷网| 日日操夜夜擼| 艹| 婷婷综合激情| 国内一级精品| 色五月婷婷亚洲最大| 色欧美色色色| 艹| www.zbzhongsen.com| 99视频久久| 中文av网| 日韩伊人大香蕉| 99福利视频| 亚州美女| 久热这里精品免费| 亚洲精品又粗又大又爽A片| 人妻久久久久| 99热免费| 色欲操| 激情五月天网站| 99九九99九九九视频精彩| 五月天最新网| 极品九九九九九九| 久久色9| 日韩美女羞羞网站在线观看| 噜噜吧天天爱| 9久热在线视频精品| 五月天亚洲综合网| 日本精品九九九| 婷婷五月天在线观看免费| 五月婷婷亚洲天堂97色婷婷| 五月丁香婷婷伊人| 狠狠色婷| 五月丁香六月综合激情无码软件亮点| 六月婷婷最新网址| 五月丁香婷婷婷激情爱爱| 激情图片久久| 欧美色色色色色色色色色色| 丁香婷婷色色| 9久久精品| 激情性爱五月天| 婷婷激情性爱| 亚洲激情在线| 亚洲综合婷婷五月| 俺去婷婷 丁香| 九九色综合九九色| 九九99九九99| 性无码专区无码| 99热这里精| W色综合| 色婷婷久久综合丁香五月| 超碰2021| 欧美日韩成人在线网站| 国产超碰在线| 蜜桃成语时李时珍 免费| 亚洲久久婷婷丁香五月天| 99视频| 99re这里只有精品视频了| 日韩大片艹艹| 国产成人亚洲综合A∨婷婷| 草美女在线观看视频在线播放| 成人精品视频99在线观看免费| 91人妻视频| 激情五月婷婷她| www.色9| 丁香六月色婷婷欧美| 亚洲精品无码一区二区| 久久小片| 五月丁香成人网| 成人精品一区日本无码网| 九九热这里只有精品31| 精品久久久999| 久久亚洲婷婷| 亚洲精品激情| 久久婷婷激情五月天一区二区| 日欧一片内射VA在线影院| 99亚洲色色| 亚洲色图45p| 综合五月天亚洲婷婷| 成人精品视频99在线观看免费 | 激情五月天影院| 久久五月视频| 五月丁香婷久久| 久久婷婷五月综合色奶水99啪| 亚洲激情图文小说| 中文字幕五月久久婷| 另类在线| 26uuu丁香婷婷五月| 思思热久久阴99| 在线超碰精品| 欧美电影在线播放| 大香蕉中文| 第四色五月激情网| 色激情五月| 亚洲成av人影院| 天天爱天天秀天天做| 婷婷五月天成人五月天| 色色色色色色色色色色色色色五月天 | 色色亚洲无码| 丁香激情五月| 婷婷五月欧美综合| 五月亭亭直播| 婷婷婷久久久| 996热re视频精品视频这里| 丁香五月婷婷AV| 婷婷五月丁香图片人人操| 五月丁香婷婷基地| 天天玩夜夜操| 就爱射中文字幕资源网| 婷婷丁香六月五月天| 99碰在线视频| 97久久婷婷色| 亚洲日本韩国| 播播网色播播| 9久热| 人人爽天天爽| 天天色综合网1| 美妞av| 日本久久婷| 玖玖激情网| 国产肥白大熟妇BBBB视频| 五月丁香色| 色五月女| 99综合激情久久精品久久| 激情 五月 婷婷 丁香| 可以直接看的av| 亚洲五月综合色播| wWwCom夜操wwW| 五月天婷婷综合免费| 色丁香综合影院| 99精品久久久久久久婷婷| 激情婷婷五月社区| 日本V在线观看不卡视频网站| 五月婷丁香| 色色丁香婷婷| 五月婷婷色影院| 狠狠的日| 婷婷五月激情小说| 五月天网站免费欧美| 五月婷婷九月婷婷九月婷婷| er99免费视频在线| 色婷丨日丨天丨综合久久| 天天色·欧美| 色五月婷婷五月丁香五月激情五月视频 | 日韩精品一区二区亚洲AV观看| 五月婷婷丁香综合网| 99久久成人| 日日想日日夜日日操| 婷婷丁香熟女| 在线观看av网站| 思思热热久久| 五月天激情小说| 97久久五月丁香婷婷| 六月激情婷婷综合| 色播五月丁香| 日韩在线99| 99视频一区| 69精品人人人人| 男人的天堂97| 五月色影院| 亚洲V国产V欧美V久久久久久| 999激情视频| 五月婷AV| 96精品成人无码A片观看金桔| www,色婷婷| 亚洲精品午夜国产va久久成人| 国产亚洲精品久久久久久牛牛| 玖玖婷婷综合| 色爱综合网| 久久一伦| 综合久久99| 丁香狠狠色婷婷久久无码视频| 五月天婷婷午夜丁香| 丁香久久综合| 一区二区免费看| 高清无码视频网址| 色婷综合| www.99热视频| 久久精品五月| 亚洲五月婷婷| 综合性爱网| 思思热在线播放| AV亚洲在线| 99只有这里是精品| 亚洲人成播放网站| 婷婷五月天激情网站| 天天干在线播放| 五月丁香婷中文| 老美AA片| 另类五月激情| 97婷婷在线| 久久婷婷内射| 五月天综合在线| 精品久热| 激情精品久久| 日韩成人不卡| 色狠久| 久久丁香九| 开心深爱激情网| 婷婷五月激情五月丁香五月| 99色色视频| 丁香六月婷| 色婷婷伊人| 爱射综合| 亚洲亚洲人成综合网络| 婷婷五月天激情网站| 91丁香婷婷综合资源| 色情五月婷| 另类天堂| 超碰人妻公开在线| 六月丁丁香| 激情婷婷丁香五月天| 夜夜夜夜夜操| 久久婷婷欧美| 99色免费| 色情五月综合婷婷| 日日操,夜夜爽| 99综合成人视频在线观看| 色玖玖综合| 99五月丁香丁| 综合五月激情| 色婷操逼| 五月综合六月丁| 久久九⑨| 九月色婷婷| 五月婷六月丁香| 婷婷五月18永久免费网站| 五月天色社区| 丁香婷婷成人在线播放| 成人av播放| 国产乱子轮XXX农村| 五月丁香色婷婷综合| 久久精品99久久| 99操视频| 九九热最新| 另类五月婷婷| 九九九九九九毛片| 强壮的公次次弄得我高潮A片日本 | 综合激情五月天六月婷免费视频| 无码se| 婷婷激情五月天激情小说| 丁香五月天堂网| www一区二区三区| 日本片日本片祼观看网站在线看中文版网页在线看 | 米奇影视资源777狠狠色婷婷五月天激情网 | 蜜乳中文字| 婷婷五月69| 91久草五月天婷婷| 久久综合九色综合97婷婷| 超碰在线超碰| 激情色视频| 色五月婷婷激情综合网| 精品久久婷婷| 九九婷婷热| 99成人在线观看| 亚洲中文乱字字幕在线永久| 一个色的综合| 色综合久久888| 青青999| 狠狠干综合| 噜噜干日本| 色五开心五月五月深深爱| 26uuu国产色| AV网站免费在线| 人人操碰| 秋霞九九无码| 日韩人妻白浆视频系列| 九色PORNY9l原创自拍| AA久久| 五月丁香六月综合激情无码软件亮点| 色 五月俺去也| 午夜丁香| 大香蕉九操| 性爱网六月丁香| 超碰cap| 色噜噜狠狠色综合日日| 人人操人人看97干| 99色热| 在线99精品| 天天人人人人人人人人人人人| 在线看av| 99久精品视频| 99这里有精品视频| 久热99| 五月婷丁香花| 色婷婷成人做爰A片免费看网站| 开心亚洲久久开心| 91精品久久久久久久久久| 思99热精品久久只有精品| 综合色、色综合| 凹凸操Av| 99人人操人人操人人精| www婷婷| 天天性视频| 五月婷婷六月激情| 99热这里只有精品 搜| 熟妇天天综合| 激情丁香九九五月综合网| 亚洲成人影视在线观看| 99精品无码| 色五月婷婷天天操夜夜操| 婷婷五月激情综合网| 天天做天天爱天天爽综合网| 婷婷久久五月天丁香| 欧美操人| 色情五月天se| 亚洲AV永久无码影院黑人 | 久久青青日本视频| 99久在线精品99re8热| AV电影在线播放| 99色热视频| 久久五月情| 99九九精品| 六月伊人婷婷| www.婷婷| 五月婷婷播| 一本久婷婷综合| 超碰三级片| 日韩抽插操逼| 免费超碰在线| 久久激情视频| 色综合激情| 亚洲九区| 五月 婷 久| 网色99| 五月伊人视频在线看| 超碰99热在线观看| 婷婷丁香六月| 五月开心激情| 99热精品在线播放观看| 在线99精品| 狠狠狠狠狠狠| 五月天婷婷免费视频| 九九家庭影院| www激情网站| 性爱久久| 丁香六月婷| 丁香五月婷婷乱| wWW九九在线播放| 丰满少妇猛烈A片免费看观看 | 51国精产品自偷自偷综合| 夜夜操天天爽| 亚洲国产精品成人免费一区久久久在线观看AAAA | 丁香六月激情| 国产成人高清| 亚洲国产精品综合色区| 久久久久久欧美精品se一二三四| 婷婷丁香五月视频| 五月婷婷激情综合| 9有码中文| 色五月综合婷婷| 超碰成人电影| 婷婷久久婷婷| 久久久久久久11111111111| 国产成人AV在线| 丁香五月婷婷激情中文| 这里只有精品,日韩视频| 欧美性爱一区| 亚洲第二AV| www.色五月| 婷婷五月天伊人网| 五月婷婷,狠狠操| 99热成人在线观看| 一二三区视频韩国| 丁香六月婷婷激情综合| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 色婷婷婷婷五月天| 五月丁香久久激情网| www.狠狠| 九九久久99精品免费观看www| www99精品亚| 天天插天天干| 久久久精品人妻| 色综合久久综合中文综合网| 综合图片色色| 黄色激情五月天| 色五月成人在线| 丁香五月婷婷成人综合| 国产免费一区二区在线A片视频| 五月婷婷九| 97偷拍对白视频| 99色免费视频| 99r这里只有精品哦| 99热精品在线播放| 日本69日人视频| 五月丁香在线观看99| www.91AV.COM| 婷婷伊人綜合| 伊人9草在线观看| 狠狠综合久久综合| 天天婬色综合| 青青操日本摸摸看看| 激情婷婷五月丁香啪啪啪| 一本色道久久88综合日韩精品| 99久久婷婷国产综合精品草原| 亚洲操b| 狼人久草| 99在线观看| 丁香五月婷婷啪啪| 另类小说五月天| 五月婷婷无码| 五月天啪啪啪| 99这里有精品视频| 国产精品久久久久久久久久 | 91人人人人人人人| 操碰99在线视频观看| 国产黄色大片| 97人妻碰碰碰久久| 久草狼人| 热99精品视频五月| 丁香婷婷啪啪| 激情五月第四色| 五月色婷婷影视在线电影| 天天成人综合| 9999色色色色| 99re热视频这里只精品5| 婷婷五月草| 狠狠狠狠狠狠色| 色婷婷丁香五月| 99色热| 丰满老熟妇BBBBB搡BBB| 99热传媒| 97精品自拍视频| 99色综合网| 天天天天天天天干| 激情五月婷婷综合视频| 日本色色色| 久久婷婷综合国产| 一级性爱视频| 无码激情AAAAA片-区区| 果冻传媒A片一二三区| 激情性爱网站| 日本九九九九| 五月丁香WWW| 婷婷五月天首页| 舔色婷婷| 亚洲色网址| 国产婷伊人| 天久久久久| 婷婷久月| 操逼福利视频| 播五月丁香三月婷婷| 热九九精品| 国产FREESEXVIDEOS性中国 | 婷婷五月丁香伊人| 色丁香婷婷| 中文字幕日产A片在线看| 亚洲一区二区色图-亚洲精品国产精品乱码-成人AV | 亚洲婷婷丁香五月天激情小说| 婷婷五月天激情五月天| 大香蕉五月婷婷| 欧美电影在线观看| 超碰国产在线观看| 丁香色六月婷婷| 亚洲va欧洲va国产va不卡| 婷久久| 99原创自拍视频在线观看| 日本三级色| 五月丁香亚洲综合| 碰超亚洲| 日本老女人黄页在线播放| 婷婷色情小说| 天天日夜夜拍| 91操女| 久久久人妻久久久| 五月丁香在线看| 色色色欧美| 婷婷九月丁香中文| 激情丁香婷婷六月天| 99热这里只有免费精品| 综合网亚洲| 五月丁香A片| 色色综合成人网| www,天天干| 狠狠综合网| 色五月婷婷操逼| 国产日日操夜夜操的肉棒视频| 欧美久热| 先锋男人91资源| 99色看这里只有精品| 丁香五月最新地址| 在线视频九色97| 91狠狠综合久久久久久| 99热都是精品| 国产一级片色色| 九九热这里只有精品7| 久狠狠狠| WW婷婷五月天com| 超碰碰碰碰| 五月婷婷亚洲色视频| 99re热视频这里只精品| 激情丁香婷婷| 天天澡天天狠天天天做| 婷婷丁香九色| sS丁香五月婷婷| 情色五月天网站| 婷婷黄色五月| 这里只有精品在线免费视频| 婷婷五月花| www超碰| 五月天婷婷伊人| 综合久久综合五月天婷婷| 亚洲天天免费| 久久综合丁香激情五月| 色噜久| 99国产这里只有精品| 日韩一区二区A片免费观看| 婷婷色婷婷亚洲成人| 97热在线精品| 影音先锋天天日| 噜噜色com| 九九综合九| 日日婷婷不卡| 国产精品18久久久| 久久五月天婷婷视频| 久久婷婷色色| 婷婷五月电影| 在线观看av网站| 亚洲人人操| 99久久性爱| 91久久久久| 色五月成人网| 影音 五月 婷婷 久久| 婷婷涩涩网| 99在线精品免费视频| 激情小说五月丁香在线视频观看视频| 色五月丁香网| 丁香五月天在线观看视频| 激情综合久久| 国产 码在线成人网站| 97啪啪| 91婷婷丁香| 婷婷久久网| 五月天婷婷色色| 99亚洲精品视频在线观看| 超碰久热| 99在线观看亚洲| 婷婷五月天av| 五月丁香WWW| 91打屁股免费看| 这里只有精品久| 在线视频九色97| 丁香激情五月少妇| 97艹| 另类图片激情五月| 日本91在线| 婷婷丁香五月综合| 欧美日韓成人亚洲精品另类| 国产毛片欧美毛片久久久| 丰满人妻一区三区三区| 欧美A A A A A| 综合激情站| 另类激情码| 三级三久久线久久99久目本WW| 五月丁香狠狠爱| 丁香五月天激情| 色五月婷婷激情五月| 播丁香五月婷婷欧美| 另类综合婷婷五月天欧美视频| 人人操人人添人人摸97| 天天插天天插| 激情五月天视频| 色五月婷婷五月天| 婷婷五月综合视频| 97婷婷在线视频| 三级黄网站| 婷婷综合网在线| 久久综合55| 天天操中文字幕| 这里只有精品免费在线视频| 国外亚洲成AV人片在线观看| 淫水导航| www久久艹| 国产激情综合五月久久| 天天射综合网夜夜操| 色一情一乱一乱一区9| 激情色色| 亚洲女婷婷五月基地综合久久久| AV变态另类一区二区| 99丁香五月婷| 亚洲成色综合网站免费观看| 九月丁香婷婷网| 色综合九九色综合88| 国产精品色色666| 爱iii做iiii日日| 婷婷久月| 日本va视频| 亚洲小电影在线观看黄999| 播播网色播播| 天天爽天天日天天舔| 五月婷色| 涩涩激情五月婷婷| 六月婷婷中文字幕| 99热这里只有精品国产首页| 超碰成人电影| 天天干天天av天天射 | 激情五月天色婷婷综合| 色婷婷A| 亚洲日本韩国| 五月天丁香综合久久国产| 激情五月天开心网丁香无码| 久久久久久久久久婷婷| 婷婷色婷婷| 成人丁香五月| 国产99精品免费视频| 欧美色碰| 91人人人人人| 色色五月婷| 国产五月天欧美色| 都市激情蜜桃婷婷五月天| 69精品无码一区二区三区| 五月丁香激情综合网| 婷婷色五月在线视频| 亚洲中文无码成人| 91色干| 中文字幕婷婷9月天| 91精品国产91久久久久青草| 欧美色欲色欲天天天www| 9久精品| 大香婷婷| 成人做爰高潮A片免费视频 | 亚洲V国产V欧美V久久久久久| 色五月激情综合| 五月天激情网页| 丁香九月婷婷| 色色日本欧美| 五月久久丁香| 激情深爱五月天| 色色五月丁香婷婷| 色婷婷成人| 襙逼网| 丁香五月亚洲AV| 麻豆精品| 久婷狼色诱惑在线| 思思99热| 五月天综合视频| 婷丁香五月天| 成人丁香婷婷| 婷婷五月丁香成人| 电影蜘蛛女| 亚洲九九夜夜| 色婷久九| 很很色丁香久久停停| 婷婷丁香18| 乱岳熟女50岁| 9l视频自拍9l九色成人| 91啪啪视频| 丁香激情网| 热婷婷在线视频| 久久A极片| 亚洲精品又粗又大又爽A片| 人人爱国产| 日本啪啪天堂| 色吧五月婷婷| 欧美激情综合色综合啪啪五月| 人人爱人人添| 五月天色婷婷基地| 开心五月激情站| 婷婷五月综合欧美在线播放| 免费国产VA国产免费| 丁香五月婷婷激情网| w婷婷五月婷婷w| 婷婷五月中文字幕| 婷婷亚洲久久| av操一操| 婷婷综合在线播放| 国产AV不卡福利| 91性人人| 91视频综合网| 91疯狂操操操操| 激情五月综合久久| 九九十99视频| 99综合自拍| 色狠狠999综合| 99在线观看视频| 97狠狠色| 五月婷在线观看| 97综合在线| 大香蕉久久| 九九99在线观看视频| 丁香六月色婷婷欧美| 操人妻90p| 丁香五月天婷婷久久| 婷婷色色播五月天| 五月丁香五月天现场视频| 九九久久视频| 婷婷五月天激情在线| 丁香色五月婷婷| 久久五月丁香| 一区视频网站| 99网| 国产欧美精品AAAAAA片| 婷婷六月激情综合| 99热九九九九| 91chinese 在线| 日日噜狠狠| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 一起草aV| 激情综合五月天| 婷婷五月四狠狠| 五月天激情婷婷五月天久久| 天天爽天天摸| 狠狠色五月| 五月天开心激情综合网| 欧美激情性做爰免费视频| 91性交在线播放| 91n啪啪| 丁香五月最新地址| 天天情天天狠天天透| 色久婷婷网| 国产精品视频久久99| 综合色播| 亚洲成人五月天| BBWCUCKOLD精品熟妇| 99九九热播在线免费视频| 先锋资源91| 色婷婷婷av| 这里只有精品9| 91丨九色丨熟女丰满| 久热91| 影音先锋男人AV资源站| 991国产精选视频在线播放下载| 99视频色在线观看| 激情5月天天天| 六月婷婷视频| 精品久热| 热婷婷av| 99视频在线| 婷婷五月天激情综合网| 99热综合色图| 日本精品久久久久中文字幕| 在线日本www| 日本三级韩三级99久久| 亚洲色欲AAAAAA| 久久99激情| 成人精品一区日本无码网 | 欧美色婷婷| 婷婷五月综合在线| 天天天天操| 激情综合五月婷婷| 色综合9| 俺来也综合网精品一区| 99愛国产| 人人摸人人摸| 日本97人人| 99色6爱9热| 亚洲色频| 人妻熟女一区二区AV| 六月婷婷香蕉| 亚洲激情视频网| 翔田千里 50岁 无码| 综合AV网| 91丨九色丨东北熟女| 一本久道综合色婷婷五月| 天天激情站| 亚洲婷婷综合视频| 久久一热免费视频| 超碰国产在线观看| 影音先锋日本三级资源| 另类亚洲2| 欧州色色| 色伦专区97中文字幕| 婷婷激情性爱| 五月天婷婷丁香社区| 综合五月婷婷| 在线观看欧美| 日本熟女内射| 色色婷婷丁香| 九色91美女| 五月综合色播播丁香婷婷 | 五月色丁香综合| 婷婷丁香色情| www.91AV.com| 99re26视频| 色婷婷丁香五月| 超碰在线国产9| 岛国AV网| 大香蕉五月婷婷丁香| 天天操夜夜啊| 成片免费播放| 久热丁香| 天天天天天日| 丁香婷婷九月在线| 亚洲激情免费久久| 亚洲高清在线| 九九精品99久久久| 丁香色综合| 色色欧美。| 77799热| 激情五月天电影| 亚洲综合在线播放| 无码区婷婷五月花开| 婷婷九月久久| 婷婷五月天人妻| 超碰国产在线| 97操碰在线视频| 婷婷激情五月天桃花网| 日日夜夜狠狠婷婷色| 丁香六月色婷婷| 色综合偷拍| 色色日本| 国产探花一片区| 2025年最新亚洲在线欧美| 性欧美大战久久久久久久83| 袁子仪视频观看| 91一起操| 激情丁香久久| 婷婷五月天综合网| 久久婷五月| 婷婷久久综合| 思思99热这里只有精品| 99热精品在线| 日本色色图| 丁香六月色婷婷| 色综合久久天天综合网| 久99久在线| 97碰在线视频| 欧美日韩999| www,久久久| 婷婷亚洲影院| 开心五月激情网| 久久99网| 色色色精品无码区| 五月综合视频| 丁香狠狠| 九九一区| 丁香五月天天高清在线| 色色草97| 五月婷婷天天| 五月天激情网址| 狠狠色狠狠| 色五月激情综合网| 婷婷爱五月| 综合xx网| 成人免费黄色短视频| 五月丁香基地| 婷婷综合另类| 97极品在线| 丁香六月婷婷开心| 免费亚洲婷婷| 五月丁花色综合网| 天天操天天国产三级片处女学生妹| 色婷婷丁香五月天在线观看| 99久在线精品99re5热视频| 伊人激情啪啪| 狠狠色五月激情| 午夜不卡久久精品无码免费| 亚洲五月情| 91日精品| 99综合久久| 色色色在线免费视频| 五月Huangsewang| 天天日,天天插| 91狠狠色色丁香婷婷综合久久| 另类天堂| 《》【无码】想被搞到爽AV应募而来的超M素人 西纯子 10musume-011723-01 | 亚洲天堂婷婷丁香| 天天爽免费视频| 国产精品成人AV在线| 欧美成人va| 米奇影视五月天| 婷婷五月天午夜激情影院| 色色婷| 情五月亚洲婷婷| 黄色AAAAAAA| 99热9999| 五月丁香网站在线播放| 色婷婷aV四虎| 五月婷婷综合网| 色色色色色色色色色999| 深爱激情婷| 婷婷视频网| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 成人视频一区| 久久婷五月综合色| 欧美操综合| 五月天激情国产综合婷婷婷| 五月丁香激情六月| 在线成人网址| WWW.久久.COM| 另类视在线| 日韩狠狠色婷婷| 人人爽欧美婷婷久久久五月丁香| 狠狠干天天日| 99精色| 婷婷激情五月天天天开心| 精品操逼一区二区| 婷婷五月色天| 婷婷五月视屏| 99亚洲综合| 1024操逼视频| 久久性刺激|