免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

前端圖編輯器核心揭秘:從數(shù)據(jù)模型到Canvas渲染的完整實戰(zhàn)

前端圖編輯器核心揭秘:從數(shù)據(jù)模型到Canvas渲染的完整實戰(zhàn) 先從結(jié)論說起這類名為“diagram-design”的項目核心目標從來不是“畫出好看的圖”而是“讓圖和背后的數(shù)據(jù)關(guān)系對得上”。我在實際動手做了幾個月之后最大的感受是圖表設(shè)計最難的部分不是渲染而是把數(shù)據(jù)模型、交互狀態(tài)和視覺表現(xiàn)三者解耦清楚。下面把我的完整設(shè)計與實操過程拆開講從數(shù)據(jù)建模到渲染管線再到避坑實錄都整理出來。1. 整體設(shè)計思路先想清楚“圖”到底是什么1.1 核心需求拆解在動工之前我先把這個標題翻譯成具體的功能清單。所謂“diagram-design”往細了說無非是三件事創(chuàng)建和編輯節(jié)點節(jié)點有坐標、大小、樣式可以被拖拽、縮放、刪除、復(fù)制。建立連接關(guān)系節(jié)點之間通過邊連接邊能記錄從哪里出發(fā)、到達哪里還能在中途拐彎。整體視圖控制畫布可以縮放、平移局部細節(jié)和整體結(jié)構(gòu)可以切換查看。這三件事拆完之后我發(fā)現(xiàn)真正的難點在第一件事的前半句“坐標、大小、樣式”這些數(shù)據(jù)從哪里來答案是從用戶的操作中來但操作只是表象背后必須有一份可以被持久化、被復(fù)制、被程序讀取的數(shù)據(jù)結(jié)構(gòu)。否則你畫出來的圖只能看不能存更不能參與業(yè)務(wù)邏輯判斷。我做了一個取舍所有的圖形元素都用純數(shù)據(jù)描述不把任何視覺狀態(tài)混進去。節(jié)點的位置、顏色、大小是數(shù)據(jù)節(jié)點處于“選中”“高亮”這類交互狀態(tài)則不屬于數(shù)據(jù)——它們是運行時的臨時狀態(tài)。這個分離規(guī)則在后續(xù)開發(fā)里幫我省了大量麻煩。1.2 為什么不自已從零折騰一套復(fù)雜引擎很多人一聽到圖表設(shè)計第一反應(yīng)是去引入現(xiàn)成的開源庫。這個思路沒有問題但對于我這種希望深度定制交互、并且要把圖數(shù)據(jù)導(dǎo)入導(dǎo)出到其他系統(tǒng)的場景現(xiàn)成庫反而會帶來幾層限制它的數(shù)據(jù)格式是固定的你的業(yè)務(wù)模型得遷就它它的狀態(tài)管理是內(nèi)置的你想和外部框架聯(lián)動得靠事件橋接它的自定義渲染能力再強也不可能完全覆蓋你想要的視覺規(guī)范。所以我的判斷是自研一個輕量級圖編輯器核心是值得的。這里“輕量級”三個字很重要它意味著不需要處理巨型圖、不需要復(fù)雜的動畫引擎、不需要多用戶實時協(xié)同。我的目標是支撐單畫布內(nèi)幾百個節(jié)點、上千條邊的規(guī)模同時保證交互不掉幀。這個量級下完全可以通過合理設(shè)計做到。當然如果圖規(guī)模到了上萬個節(jié)點或者需要多人同時編輯那自研的代價會急劇上升此時使用成熟的圖編輯平臺反而更劃算。取舍的關(guān)鍵指標就一個圖和你的業(yè)務(wù)數(shù)據(jù)之間耦合得有多深。1.3 技術(shù)方案選型我的技術(shù)棧定在純前端主語言用 TypeScript。選擇 TypeScript 的理由非常直接圖數(shù)據(jù)涉及大量類型定義節(jié)點類型、邊類型、端口類型在編譯期就定死比靠人腦記憶字段名靠譜得多。數(shù)據(jù)渲染層我選擇了兩套渲染方案并存畫布Canvas負責主場景渲染SVG 負責少量裝飾性元素。具體理由在后面的渲染章節(jié)詳細展開這里先給結(jié)論——Canvas 在復(fù)雜場景下性能優(yōu)勢明顯但文本適配和局部更新不如 SVG 靈活所以兩者各司其職。狀態(tài)管理方面我引入了一個簡單的狀態(tài)機維護畫布當前的模式空閑、拖拽節(jié)點中、連線中、框選中。每種模式對應(yīng)的鼠標事件處理完全不同用狀態(tài)機可以避免大量互相打架的 if-else。整體架構(gòu)分成了三層數(shù)據(jù)層節(jié)點、邊、端口的純數(shù)據(jù)模型負責增刪改查和序列化。視圖層負責將數(shù)據(jù)模型渲染到畫布并處理視口變換。交互層監(jiān)聽鼠標、鍵盤事件將其翻譯成數(shù)據(jù)層的修改操作。這個分層的核心原則是單向數(shù)據(jù)流用戶操作 → 交互層解析 → 修改數(shù)據(jù)層 → 視圖層訂閱變化并重繪。交互層不直接改畫布視圖層不反向改數(shù)據(jù)數(shù)據(jù)層不感知任何 UI 細節(jié)。2. 核心數(shù)據(jù)模型把所有圖形變成可存儲的數(shù)據(jù)2.1 節(jié)點、邊、端口的建模細節(jié)先說我經(jīng)過幾次重構(gòu)后的最終數(shù)據(jù)結(jié)構(gòu)。一張圖我用一個對象表示包含三塊interface Diagram { id: string; nodes: Mapstring, DiagramNode; edges: Mapstring, DiagramEdge; meta: DiagramMeta; } interface DiagramNode { id: string; type: string; x: number; y: number; width: number; height: number; ports: Port[]; // 連接錨點 data: Recordstring, unknown; // 業(yè)務(wù)數(shù)據(jù)不渲染但持久化 } interface Port { id: string; position: top | bottom | left | right; offset: number; // 端口在該邊上的相對位置0~1 } interface DiagramEdge { id: string; sourceNodeId: string; sourcePortId: string; targetNodeId: string; targetPortId: string; points: Point[]; // 折線的中間拐點可為空 data: Recordstring, unknown; }我公開過很多次這個數(shù)據(jù)結(jié)構(gòu)每次被問到最多的都是為什么要單獨拆出一個Port概念而不是直接用節(jié)點坐標計算連接點關(guān)鍵在于邊的連接位置必須是穩(wěn)定、可恢復(fù)的。如果一條邊連接的是“節(jié)點A的右側(cè)邊緣中間”那么無論節(jié)點A怎么移動這條邊的連接點都會跟著右側(cè)邊緣跑。如果你只存了節(jié)點的中心點每次重新計算連接點就會受節(jié)點尺寸變化影響——節(jié)點一旦改變寬高整條邊的位置就會漂移。端口這個概念的另一個好處是它天然支持“同節(jié)點多連接錨點”。一個節(jié)點可能有多個輸出口每個輸出口都是獨立的端口邊只需要記錄端口 ID 即可不需要關(guān)心端口的具體坐標。坐標由視圖層根據(jù)節(jié)點位置實時計算。2.2 數(shù)據(jù)序列化與格式兼容圖數(shù)據(jù)最終要能被保存到文件、數(shù)據(jù)庫或者發(fā)送給后端。所以序列化格式的設(shè)計非常關(guān)鍵。我用的是帶版本號的 JSON Schema{ version: 1.3.0, diagram: { id: diagram-001, meta: { title: 訂單流程圖 }, nodes: [], edges: [] } }version字段是我踩過坑之后補上的。起初我在本地開發(fā)時沒有版本號后來數(shù)據(jù)結(jié)構(gòu)調(diào)整舊數(shù)據(jù)全部無法解析幾千條測試數(shù)據(jù)直接作廢。加上版本號之后每次寫解析器都先判斷版本再決定走哪條遷移分支數(shù)據(jù)兼容的問題就徹底解決了。序列化時還應(yīng)遵循“可以丟了不致命但保留更好”的字段放最后的原則。核心節(jié)點和邊的 ID、連接關(guān)系是必須的缺了圖就廢了樣式和坐標可以恢復(fù)成默認值但保留可以提升還原度擴展字段全部掛到data對象里不占主體結(jié)構(gòu)。2.3 撤銷與重做快照策略很關(guān)鍵撤銷和重做是圖編輯器的隱形能力沒有它任何誤操作都像毀尸現(xiàn)場。我的實現(xiàn)方式是每次數(shù)據(jù)變更之前記錄上一個完整快照變更完成后記錄新快照撤銷和重做就是在這兩個快照之間切換。問題在于快照是深拷貝深拷貝的成本很高而很多操作只是一次小修改比如拖動節(jié)點拖動的過程中可能產(chǎn)生幾十次中間狀態(tài)。全量快照會讓內(nèi)存和 CPU 都吃緊。我最終采用了兩層策略拖拽、縮放這類連續(xù)操作在開始時存一份快照操作過程中產(chǎn)生的中間狀態(tài)不保存操作結(jié)束時再存一份最終快照。這樣一次拖拽永遠只對應(yīng)一次撤銷步驟。其他離散操作添加節(jié)點、刪除邊、修改顏色每次操作前存一份快照。這個方案實現(xiàn)簡單卻能把內(nèi)存占用降低一個數(shù)量級。我實測在 200 個節(jié)點的畫布上連續(xù)拖拽 10 秒撤銷棧里只新增了 2 個快照內(nèi)存波動可以忽略。3. 渲染管線的核心細節(jié)畫布為什么比想象中復(fù)雜3.1 Canvas 和 SVG 的取舍在圖表設(shè)計這個領(lǐng)域Canvas 和 SVG 的爭論從來沒有定論但我的選擇標準非常實用誰能在我的場景下用更少的代碼達到更好的交互體驗誰就上。SVG 的最大優(yōu)勢是 DOM 化每個圖形就是一個 DOM 節(jié)點可以綁定事件、修改樣式、單獨更新、配 CSS 動畫。對于節(jié)點數(shù)較少幾十到一百的圖表SVG 的開發(fā)效率明顯更高因為很多渲染細節(jié)瀏覽器幫你處理了。但當節(jié)點數(shù)上升到幾百邊數(shù)上千DOM 節(jié)點數(shù)量開始拖慢頁面。任何一個節(jié)點的重繪都可能觸發(fā)瀏覽器的樣式重算和布局更新響應(yīng)延遲會明顯變大。Canvas 沒有這個負擔所有圖形都畫在一塊畫布上沒有 DOM 節(jié)點更新時只需調(diào)用重繪函數(shù)。代價是你需要自己實現(xiàn)命中檢測、事件映射、局部更新等于瀏覽器的 DOM 能力沒法用了都得自己寫。我在項目中的最終策略是主場景用 Canvas 渲染全部節(jié)點和邊保證性能和渲染上限浮動的連接預(yù)覽線、我正在拖拽中的節(jié)點輪廓提醒這類“臨時裝飾”用 SVG 疊在畫布上層因為這類元素只存在于交互瞬間量小而靈活SVG 的語法表達更舒服。3.2 視口變換一張圖兩個坐標系圖編輯器必須支持縮放和平移這是硬需求。實現(xiàn)縮放平移的核心是理解兩套坐標系之間的換算世界坐標World Coordinates數(shù)據(jù)模型里的 x、y 是真實坐標節(jié)點之間的距離關(guān)系用世界坐標描述它不隨視口變化。屏幕坐標Screen Coordinates畫布上用戶實際看到的坐標等于世界坐標經(jīng)過平移和縮放變換之后的結(jié)果。兩者之間的換算公式簡單直接// 世界坐標 → 屏幕坐標 screenX (worldX - viewportCenterX) * zoom canvasWidth / 2; screenY (worldY - viewportCenterY) * zoom canvasHeight / 2; // 屏幕坐標 → 世界坐標用于鼠標定位 worldX (screenX - canvasWidth / 2) / zoom viewportCenterX; worldY (screenY - canvasHeight / 2) / zoom viewportCenterY;看似簡單但真做起來有兩個常見坑。第一個坑是縮放中心。用戶滾動滾輪時通常希望鼠標指向的位置在縮放后保持不動也就是“以鼠標為中心縮放”。實現(xiàn)方式是先記錄鼠標在縮放前位于哪個世界坐標縮放后把這個世界坐標重新映射回鼠標的屏幕位置從而反推出新的視口中心。公式如下const worldPointBeforeZoom screenToWorld(mouseScreenX, mouseScreenY); zoom clamp(zoom * factor, minZoom, maxZoom); // 將世界點重新投影到鼠標處反推出視口中心 viewportCenterX worldPointBeforeZoom.x - (mouseScreenX - canvasWidth / 2) / zoom; viewportCenterY worldPointBeforeZoom.y - (mouseScreenY - canvasHeight / 2) / zoom;第二個坑是縮放邊界。無限縮放會讓畫布漂到看不見的地方或者把場景縮到比一像素還小。我設(shè)置了最小 10%、最大 500% 的縮放范圍同時在實現(xiàn)上用clamp函數(shù)把計算后的 zoom 鎖死。另一個隱藏問題是縮放值如果是浮點數(shù)累計十幾次滾輪之后精度漂移會讓視圖抖動。我干脆在縮放事件里只保留兩位小數(shù)實測后用戶基本感覺不到。3.3 命中檢測與框選Canvas 渲染模式下沒有 DOM 可以點擊所有交互都要自己判斷“鼠標落在了哪個元素上”。最樸素的辦法是遍歷全部節(jié)點逐個判斷鼠標點是否落在節(jié)點矩形內(nèi)。節(jié)點數(shù)量少時這么做可以接受但節(jié)點一多每次 mousemove 都全量遍歷性能就開始露餡。我的優(yōu)化是建立一套空間索引按網(wǎng)格劃分畫布區(qū)域節(jié)點按所在網(wǎng)格注冊鼠標移動時只檢測鼠標所在網(wǎng)格及相鄰網(wǎng)格內(nèi)的節(jié)點遍歷量直接下降一個數(shù)量級。const gridSize 64; const grid new Mapstring, DiagramNode[](); function getGridKey(x: number, y: number): string { return ${Math.floor(x / gridSize)},${Math.floor(y / gridSize)}; }網(wǎng)格的鍵是坐標除以格子大小的取整結(jié)果節(jié)點插入時按其中心點所在的格子歸入對應(yīng) key。命中檢測時只查詢鼠標點所在的三個格子當前格、左側(cè)格、上側(cè)格里的節(jié)點做精確矩形判斷??蜻x的做法類似拖拽出橡皮筋選框時遍歷受影響網(wǎng)格里的節(jié)點只要節(jié)點的矩形和選框矩形有交集就視為被選中。這里要注意的是框選時需要把屏幕坐標的選框反算成世界坐標再來判斷因為節(jié)點存儲的是世界坐標直接拿屏幕坐標去比對會因為縮放平移的干擾而錯誤。我在實際實現(xiàn)中還發(fā)現(xiàn)一個細節(jié)節(jié)點選中狀態(tài)應(yīng)顯示在渲染層之外。選中節(jié)點的邊框、陰影屬于表達層狀態(tài)直接掛在臨時狀態(tài)對象里不會污染數(shù)據(jù)模型。這樣圖數(shù)據(jù)導(dǎo)出時不會包含多余信息重開畫布時也不需要重建選中狀態(tài)。4. 實操過程從空白畫布到可交互編輯器4.1 環(huán)境準備與基礎(chǔ)依賴開始編碼之前我先明確依賴清單。這里列的是我實際用到的最小集合能少裝的絕不多裝TypeScript類型系統(tǒng)核心依賴Vite開發(fā)服務(wù)器和構(gòu)建工具主打一個快無 UI 框架純 Canvas 場景框架在這場合幫不上什么忙初始化方式非常標準npm create vitelatest diagram-design -- --template vanilla-ts cd diagram-design npm install為什么不用 Vue 或 React因為 Canvas 渲染的主場景不依賴框架的虛擬 DOM節(jié)點的增刪改全由數(shù)據(jù)層觸發(fā)重繪框架反而會引入不必要的橋接邏輯。UI 面板、屬性編輯器這些外圍組件我是寫在一個簡單的 div 層上的直接用原生事件綁定即可。4.2 核心實現(xiàn)的逐步推進我按下面這張順序表逐步推進開發(fā)每完成一步都會做一次手動測試確保沒有崩壞第一步數(shù)據(jù)模型層先寫出DiagramNode、DiagramEdge、Diagram的類型定義和增刪改查方法。這個階段不碰渲染所有操作都只是純數(shù)據(jù)變化。第二步基礎(chǔ)畫布渲染創(chuàng)建 Canvas 并畫出一批靜態(tài)節(jié)點和邊驗證整個數(shù)據(jù)到圖形的映射關(guān)系。程序跑通后我加了一個背景網(wǎng)格線方便觀察坐標位置是否正確。第三步鼠標事件接入實現(xiàn)鼠標按下、移動、釋放的事件監(jiān)聽區(qū)分左鍵和右鍵行為。切換畫布模式為拖拽模式實現(xiàn)節(jié)點跟隨鼠標移動。第四步滾輪縮放與拖拽平移把視口變換邏輯接入實現(xiàn)以鼠標為中心的縮放和畫布拖拽平移。第五步連線創(chuàng)建在兩個端口之間創(chuàng)建貝塞爾曲線。按下鼠標出線移動鼠標彎曲釋放鼠標完成連接。第六步撤銷重做接入快照機制。每次操作完成后壓棧撤銷時恢復(fù)上一狀態(tài)。第七步性能優(yōu)化加入網(wǎng)格索引、視口剔除、渲染節(jié)流。每一步之間我都跑了固定測試用例建 20 個節(jié)點連 30 條邊然后移動、縮放、撤銷、重做確保沒有回歸。整個開發(fā)周期大概用了三周半每天投入兩到三小時。時間的大頭花在連線的交互適配和框選的邊界問題上這兩個點最容易出細節(jié) bug。4.3 連線交互的完整實現(xiàn)連線是整個編輯器中交互邏輯最復(fù)雜的一塊我來重點展示它的實現(xiàn)路徑。連線創(chuàng)建屬于一種特殊模式用戶從源端口點擊按下此時畫布進入connecting模式鼠標移動時需要實時繪制一條從源端口到鼠標位置的“預(yù)覽連線”釋放鼠標時程序判斷目標位置是否為合法的目標端口合法則正式創(chuàng)建邊不合法則丟棄。預(yù)覽連線的形狀我用的是三階貝塞爾曲線。為什么用貝塞爾而不是直線或者折線因為貝塞爾曲線能以一條平滑曲線優(yōu)雅地連接兩個端口且可以根據(jù)兩個端口的朝向自動調(diào)整控制點不需要我在數(shù)據(jù)模型里存儲路徑信息。曲線的控制點確定規(guī)則是源端口朝向是左側(cè)控制點就向左邊延伸目標端口朝向是右側(cè)控制點就向右邊延伸。延伸距離取兩端口之間距離的一半這樣曲線彎曲幅度適中不會過彎也不會太直。function buildEdgePath(source: Point, target: Point, sourceDirection: Direction, targetDirection: Direction): Path2D { const dist Math.hypot(target.x - source.x, target.y - source.y); const offset dist * 0.5; const c1 offsetByDirection(source, sourceDirection, offset); const c2 offsetByDirection(target, targetDirection, offset); const path new Path2D(); path.moveTo(source.x, source.y); path.bezierCurveTo(c1.x, c1.y, c2.x, c2.y, target.x, target.y); return path; }目標端口的檢測也需要注意釋放鼠標時取鼠標所在坐標調(diào)用空間索引找到覆蓋該坐標的節(jié)點再判斷該節(jié)點上是否有端口在這個鼠標位置附近。如果命中則創(chuàng)建正式邊如果沒有命中直接把預(yù)覽連線清掉。創(chuàng)建邊之前還多一步合法性校驗一條邊不能連接同一個端口兩次也不允許從輸出端口連接到另一輸出端口具體取決于端口類型定義。這些規(guī)則放在數(shù)據(jù)層渲染層不做判斷這樣可以保證無論如何操作底層數(shù)據(jù)不會進入非法狀態(tài)。4.4 自動布局與對齊輔助用戶手動拖完一堆節(jié)點后圖必然歪歪扭扭。所以我在工具欄里加了兩個自動整理功能層級布局和垂直/水平對齊。層級布局適用于流程類圖把節(jié)點按照邊的方向分層同一層的節(jié)點排列成一列或一行層與層之間的距離相等。實現(xiàn)分三步拓撲排序確定每個節(jié)點的層級。同一層的節(jié)點按原始橫向順序排列間距均勻。邊的交叉最小化我用的是一個簡化的貪心算法逐層調(diào)整節(jié)點的順序讓相鄰層的邊交叉數(shù)量盡量小。垂直對齊和水平對齊的邏輯更簡單選中多個節(jié)點取一個基準坐標比如最左側(cè)節(jié)點的 x 或所有選中節(jié)點的均值把其他節(jié)點的對應(yīng)坐標改為基準值即可。對齊操作不是一個“永久狀態(tài)”用戶隨時可以再做手動調(diào)整所以它仍然落成數(shù)據(jù)層的坐標修改配合撤銷重做棧一起使用沒有引入額外復(fù)雜度。4.5 性能優(yōu)化實戰(zhàn)性能問題在節(jié)點數(shù)超過 300 之后開始顯現(xiàn)。第一件導(dǎo)致卡頓的事是每次重繪都清空整個畫布并重畫全部節(jié)點和邊。優(yōu)化手段是視口剔除只繪制當前視口可見范圍內(nèi)的元素function isInViewport(node: DiagramNode, viewport: Viewport): boolean { return ( node.x node.width viewport.left node.x viewport.right node.y node.height viewport.top node.y viewport.bottom ); }視口的邊界值直接由視口中心坐標和縮放后的窗口尺寸計算得出。由于世界坐標和視口邊界都經(jīng)過縮放換算這個判斷非常便宜。第二件導(dǎo)致卡頓的事是鼠標移動過程中觸發(fā)密集重繪。我引入了requestAnimationFrame節(jié)流移動事件只更新狀態(tài)標記不直接重繪動畫幀到來時檢查標記若有變化才重繪。這樣把重繪頻率從 mousemove 的每次觸發(fā)可以高達幾百次/秒降到了屏幕刷新率60次/秒體驗反而更平滑。第三件是字體渲染消耗。Canvas 每幀繪制大量文本字體解析很貴。優(yōu)化方案是把文本渲染單獨抽出來啟用ctx.font的緩存只有在字體字符串變化時才更新。實際測試中這個優(yōu)化帶來了 20% 左右的渲染耗時下降。5. 常見問題與排查技巧實錄5.1 高頻問題速查表我把開發(fā)過程中遇到的高頻問題整理成一張速查表每一個都附了對應(yīng)的排查思路?,F(xiàn)象可能原因排查/解決方式拖拽節(jié)點時圖形跳動事件綁定時誤用了局部坐標而非全局坐標確認鼠標事件計算的坐標已通過getBoundingClientRect去除畫布偏移滾輪縮放后視圖抖動縮放倍數(shù)是浮點累積導(dǎo)致精度漂移縮放后對 zoom 值做四舍五入保留兩位小數(shù)連線總是對不準目標端口端口坐標計算沒有考慮節(jié)點拖拽后的位移確保端口坐標在每次渲染前按節(jié)點當前世界坐標重新計算撤銷一步后整個圖回到幾秒前快照覆蓋了整個畫布拖拽中間態(tài)也被記錄連續(xù)操作只記錄起始和結(jié)束快照中間態(tài)丟棄框選時選中了看不見的節(jié)點屏幕坐標和世界坐標混用框選矩形按視口變換反算為世界坐標再進行相交判斷Canvas 文字發(fā)虛或模糊高 DPI 屏幕下沒有做像素比適配畫布實際尺寸乘以window.devicePixelRatio再設(shè)置 Canvas 物理像素5.2 一個典型的數(shù)據(jù)恢復(fù) bug 復(fù)盤我想單獨講講之前遇到的一個 bug它花了最長的時間?,F(xiàn)象是用戶打開一個保存過的圖形文件所有節(jié)點都在但節(jié)點之間原本存在的邊全部消失了或者邊的兩端都連到了奇怪的端口位置。初步排查時我懷疑是渲染層沒畫出來但控制臺輸出邊的數(shù)據(jù)是存在的。繼續(xù)追查發(fā)現(xiàn)邊的數(shù)據(jù)里記錄的sourcePortId和節(jié)點上的ports數(shù)組對不上——原來的端口 ID 在節(jié)點移動時被重置了但邊的數(shù)據(jù)沒有同步更新。根因是節(jié)點有一個“重置端口”的操作邏輯會為端口生成新的 UUID但此時關(guān)聯(lián)邊仍然握著舊端口的 ID。因為沒有做級聯(lián)更新舊端口 ID 查無此人渲染層自然畫不出連線。修復(fù)辦法是在重置端口的邏輯里增加一步先遍歷所有關(guān)聯(lián)該節(jié)點的邊把邊的端口 ID 更新為新端口 ID然后再執(zhí)行重置操作。這個案例給到一個通用教訓圖數(shù)據(jù)模型里凡是要改節(jié)點內(nèi)部標識符ID的操作必須先檢查關(guān)聯(lián)邊的引用關(guān)系。這類引用一致性問題是圖編輯器的地雷往往不會當場爆而是在用戶重新加載時爆。5.3 排除性能瓶頸的順序策略當畫布開始卡頓我的排查順序是先看是否在拖拽/縮放的動畫幀里做了全量重繪。這是最常見的性能殺手占比超過一半。再看命中和渲染是否做了無謂的遍歷。例如每次鼠標移動觸發(fā)全量遍歷而不是網(wǎng)格索引。然后檢查是否有內(nèi)存泄漏導(dǎo)致的 GC 壓力典型情況是事件監(jiān)聽器沒有解除。最后才看圖形本身的繪制開銷比如陰影、漸變這類視覺效果本身會拖慢渲染。前三個問題都是代碼結(jié)構(gòu)問題修復(fù)成本低效果立竿見影。第四個通常是為了視覺效果做出的主動取舍需要靠視覺降級方案比如只在選中的節(jié)點上繪制陰影而不是所有節(jié)點來平衡。6. 關(guān)于擴展方向的一點體會圖表設(shè)計做到這里基礎(chǔ)能力已經(jīng)完整了但我梳理下來發(fā)現(xiàn)還可以往幾個方向走。一個是把導(dǎo)出能力增強。目前只能導(dǎo)出 JSON 和圖片快照后續(xù)可以支持導(dǎo)出為 SVG 源文件、Markdown 內(nèi)嵌圖或者直接生成 PDF。導(dǎo)出 SVG 的時候需要注意Canvas 里的貝塞爾曲線要原樣轉(zhuǎn)成 SVG 的 path 元素文本節(jié)點需要轉(zhuǎn)成 text 元素并且保留字體的 family 和 size 屬性。另一個方向是多頁面支持。當前的圖是一張單畫布如果業(yè)務(wù)上需要同時管理多張圖需要加一層項目對象把圖組織成樹形結(jié)構(gòu)支持跨圖復(fù)制節(jié)點和引用關(guān)系。再一個是協(xié)作能力。多人同時編輯同一張圖是個很誘人的擴展。但要注意實時協(xié)作對數(shù)據(jù)模型的耦合度要求非常高節(jié)點 ID 必須全局唯一、邊引用必須跨端保持一致、操作記錄需要支持 CRDT 或版本向量。我的體會是如果業(yè)務(wù)沒有剛需盡量晚點碰這一塊先保證單機體驗足夠扎實。從實際交付的角度講單機圖表編輯器做好已經(jīng)能覆蓋大多數(shù)真實場景。做復(fù)雜系統(tǒng)的圖設(shè)計工具第一步永遠是數(shù)據(jù)模型穩(wěn)不穩(wěn)而不是渲染漂不漂亮。我寫的所有代碼里給之后項目復(fù)用最多的也是那套數(shù)據(jù)模型和狀態(tài)管理思路而不是任何一處渲染效果。最后分享一個實際調(diào)試中的小技巧節(jié)點多的時候不要靠人眼看圖找 bug我會在畫布里臨時按 F2 提前一層紋理把節(jié)點 ID 直接打印在每個節(jié)點的左下角。雖然它不會出現(xiàn)在正式交付版本里但排查邊連錯、端口錯位、序列化還原不一致這類問題效率能提升好幾倍。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日韩 中文 欧美| 婷婷五月天影视| 日本久久99| www.婷婷亚洲基地| 婷婷玖玖五月天| 久操无码| 亚洲AV成人在线观看| 天天射综合网站| 人妻丰满精品一区二区A片| 久操福利| 99九九精品| 99狠狠色| 婷婷五月天AV在线| 91亚洲免费片| 激情五月丁香六月综合AVXXXX| 五月天色小说| 怡红院AV亚洲一区二区三区H| 久久99精品久久久久久噜噜| 夜夜骑天天操| 激情六月天婷婷| 五月天婷婷视频小说| 91AV婷婷| 欧洲色| 九九aV| 久久婷婷六月综合国际| 综合婷婷| 丁香五月激情性色郤| 在线观看免费人成视频无码| 亚亚州久久高潮| 91日韩美女被插视频| 九九大香蕉黄色影院| 99热综合在线| 图片区 小说区 区 亚洲五月| 五月婷婷在线网站| 综合99久久天天综合| 丁香婷婷网| 色婷五月婷婷| 超级碰91| 婷婷五月成人| 99热这里是精品| 婷婷中文无码| 黄色激情网站在线观看| 色婷婷狠狠| 电影《战争与艾拉》免费观看| 99丁香婷婷综合网| 大香蕉综合网| 丁香六月激情国产| 国产色婷婷亚洲| 天天色五月婷婷91久久久久久久| www.久久久久| 欧美色爱五月天| 久久182| 婷婷内射视频在线| 天天爽夜夜爽夜爽精品| 快乐激情五月色婷婷| 日本强伦片中文字幕免费看| 99精品热视频| 日韩色五月| 99精品久久| 免费黄网不卡AV| 丁香五月综合AV在线| 国产成人综合网| 亚洲视频综合网| 日日夜夜干| 小视频aaa久久久| 日本色超碰| 99热啪啪| 婷婷 伊人 久久| 婷婷五月丁香高清无码| 99久视频| 丁香久月婷| 欧美性生交XXXXX无码小说| 狠狠草在线观看| 激情宗合哪里能看| 亚洲啪视频| 97人人操人人插| 婷香五月激情视频| 九九热10| 国产婷婷综合| 天天做好综合色| 五月激情丁香久久综合网| 91趴趴| 超碰久热| 99久久久久久www| 天天草天天日| 五月丁香好婷婷A片网| 亚洲另类婷婷综合| 久久婷婷五月综合色奶水99啪| 丁香五月天堂网| 激情久久久久久久久| 深爱五月亚洲| 青青草原中文字幕| 天天爽在线视频| 色99在线看| 精品综合网在线| 北京熟妇搡BBBB搡BBBB| 99操| 99热自拍| wwwss在线观看| 丁香久久久| 欧美激情综合色丁香婷婷五月天| 五月天堂在线| 五月综合六月婷婷| 亚州性爱99| 99惹| 亚洲九九免费| 天天综合干| 99久久精彩视频。| 婷婷五月亚洲激情| 色综合色婷婷色伊人| 大香蕉啪啪啪啪啪啪| 久久久宗合视频88| 日逼影音先锋男人资源站| 五月婷婷丁香六月| 国产毛片欧美毛片久久久| 深爱婷婷网| 午夜激情综合| 日本色频| 7777久久亚洲中文字幕| 久色资源网| 人人草碰| 东北黄色一级| 热久91| 国产看真人毛片爱做A片| 俺去也婷婷| 国产精品久久久久久白浆色欲| 色五月婷婷网| 久久久99视频| 激情五月天婷婷| 热久久91| 97色干| 天天日日夜夜| 韩国中文字幕91| 超pen个人视频97| 欧美激情综合| http://www.com久久久精品一区| 狠狠干综合| 久久资源网五月婷| 五月天激情小说| 婷婷五月天色播| 亚洲无码色色| 国产69久久久欧美黑人A片| 久久99热这里只频精品6学生| 狠狠干综合| 99热在线播放| 色综合99色| 中文字幕高清av| 人妻中文av| 91人妻九色大屁股| 狠狠色丁香久久| 亚洲情色一区| 婷婷丁香五月天色播网站| 五月丁香直播| 欧美婷婷综合| www.久久久久| 成人无码髙潮喷水A片| 亚洲中文字幕在线观看| 影音先锋91视频| 岛国在线观看91| 成人五月天。COM| 久久九⑨| 亚洲五月丁香综合网| 男女99免费视频| 丁香五月六月久久综合| 丁香六月毛片| 91成人视频| 特级西西4444www无码| 国产精产国品一二三在观看| 激情婷婷视频在线| 五月丁香美女| 激情五月天影院| 久热中文字幕| 精品二区| 五月激情啪啪| 亚洲综合色色| 天天综合网在线| 99久久这里只有精品| 欧美三级A做爰在线观看| 国产精品99久久久久久久女警| 97色五月丁香婷婷| 激情五月天色| 欧美色色网| 婷婷久久五月丁香| 草草色情综合网| 男人視頻站| 丁香五月亚洲激情婷婷射| 五月综合激情视频| 九色PORNY9l原创自拍| 国外亚洲成AV人片在线观看 | 六月丁香激情综合| 色欲久久久久久综合网综合网| 五月激情视频| 黄色aa观看aaguochan| www.91操| 五月婷婷天| 成年人丁香五月| 亚洲狠9| 99婷婷国产最新视频| 五月天第四色开心色播| 97超碰在线免费观看| 亚洲激情在线| 91精品丝袜久久久久久久久粉嫩| 婷婷丁香午夜综合影视| 色五月天丁香婷婷| 超碰成人影视| 狠狠va| 99操免费视频| 九月性爱网| 五月天激情国产综合婷婷婷就去爱| 天天影视色综合网| 99这里都是精品| 一本色道久久88加勒比—| 亚州激情在线视频| 精品人人操| 538在线精品| 丁香婷婷浪潮AV久久综合| 五月丁香琪琪| 中文字幕乱轮| 性爱综合网| 精品99在线观看| 婷婷综合成人五月天| 爆乳熟妇一区二区三区爆乳| 超碰色人妾| 四色 爱 婷婷 精品 亚洲 五月天| 9久国产精品| 九月婷婷综合色干| 九九婷婷五月天影视| 97精品在线| 极品少妇XXXX精品少妇偷拍| 涩涩婷婷五月| 狠狠五月丁香色婷| 色婷婷丁香| 神马欧美精| 日日狠夜夜狠| 小香蕉av| 天天日夜夜操五月| 精品夜夜澡人妻无码AV| 五月婷婷开心色伊人| 任你爽视频| 九伊人网| WWW.17C亚洲精品| 九九精品9| 激情深爱综合| 色婷婷小说网| 四色综合网| 欧美日本黄色| 色 五月 天 婷婷 丁香 九月| 丁香婷婷激情五月色| 二色av| 操人精品| 99乱视频| www.五月天婷婷| 丁香婷婷激情六月五月开心| 综合玖玖偷拍| 日本99在线| 精品久久婷婷| 五月天婷婷激情在线色图| 丁香网站| 五月天狠狠干| wwww.色婷婷| 国产精品视频久久99| 国产性av| 毛片色五月| 国产干逼片| 婷婷五月丁香伊人网| 99网| 天天天天天天天操| 久久综合香蕉国产国产蜜臀AV| 色色色色色色色色色999| 香蕉AV777XXX色综合一区| 99热精品少| a在线观看| 中文字幕丰满乱孑伦无码专区| 成人看片网站| 色综合播放| 天天插天天干| 99热在线观看这里只有精品| 丁香九月综合在线| 99在线精品视频| 国产综合婷婷| 夜夜骑夜夜操| 91视屏在线观看com.wwwvv| 精品人妻伦九区久久AAA片| 深爱丁香网| 麻豆AV一区二区三区| WWW五月天| 三级片AAA久久久AAA久久久AAA | 182.t午在线观看| 五月亭亭综合五码| 超碰在线免费9| 欧美综合五月丁香六月婷| 91男同| 欧美精品18| 五月熟妇婷婷久久| 五月丁香另类网| 欧洲色色| 丁香六月婷婷综合激情欧美 | 五月丁香激情综合网| 99国产小视频免费观看| 久久久久九九九九视屏小说88| 99免费| 伊人五月婷婷| 99精品偷自拍| 丁香五月色网| 五月丁香六月婷婷中文版| 99精彩视频网站在线| 五月丁香六月激情啪| 亚洲欧洲美女在线观| 六九色综合婷婷五月天| 国产中文亚洲欧美日韩性交| 丁香五月 性爱| 人人爱摸视频| 五月丁香婷婷在线综合蜜桃| 婷婷色网址| 国产精品国产| 五月丁综合在线观看| 麻豆123区| 五月天综合在线| 亚洲小说五月婷婷| 丁香婷婷五月人体| 色情婷婷| 日日爽夜夜爽| 五月色丁香婷婷中文字幕| 丁香婷婷五月综合| 成人免费120分钟啪啪| 婷婷午夜天| 天天久久66xxx| 热久久99热欧美国产亚洲| 五月天婷婷色小说| 久激情网| 99热在线网站| 婷婷久久综合| 亚洲成人无码网站| 久久在线人妻| 99国产er热视频| 五月丁香啪| 久久久久久性爱视频| 狠狠干五月天婷婷网| 97操碰人免费| 色5月婷婷| 婷婷色基地| 99热这里只有精品26| 色亭亭九月| 五月丁香婷婷欧美| 六月综合婷婷开心伊人| 亚洲性天天| 99热www| 久久久18| 日日干日日| www.狠狠干| 9精品一区| 国产毛片精品一区二区色欲黄A片| 婷婷五月天天天| 婷丁香五月天| 操一区| 亚洲 成人 电影av在线观看| 免费看欧美成人A片无码| 精品色色| 五月丁香人妻| 久久人妻系列| 久婷婷五月激情| 婷婷丁香五月91| 无码视频国内精品久久久| 婷婷视频网| 情久久综合五月天| 极品五月天| 久久婷婷六月| 日本一级黄色电影| 丁香青青五月天| 777米奇影视第四色| caop在线视频| WWW,五月| 久热这里只有| 亚洲精品五月| 日日夜夜青青草| 超碰AV在线| 中文在线成人| 色色婷婷婷丁香五月天| 99热黄| 国产精品色色| 99精品在线观看视频| 丁香五月情| 国产精品VA在线| 激情五月天婷婷视频| 五月天激情站| 《战争与艾拉》完整版| 六月激情久久婷婷| 欧洲永久精品| VA五月激情在线| 激情久久久久久| enecarbon-materials.com污K127封锁请涟系@wip1688 | 情婷婷五月天在线| 婷婷五月成年人| 99人妻碰碰碰久久久久禁片| 色五月色五天色情网| 亚洲婷婷婷| 九九丁香社区欧美激情| 99在线视频。| 亚洲成人电影在线免费观看| 国产女18毛片多18精品| 爆乳熟女-区二区三区| 五月天社区婷婷| 婷婷97色| 久9热插入| 香蕉久久五月| 99ri国产精品| 日本婷久久| 涩九九九九| …亚洲黄色在线播放日韩、av中文a…| 九九综合五月欧美| 狠狠色色综合| 99在线精品观看99| 丁香五月AV综合| 伊人大香五月天| 深爱五月激情网| 五月婷婷六月丁香综合视频在线| 五月丁香婷婷激情在线| 99九九精品视频| 婷婷六月情| 久久婷婷六月综合| 五月天婷婷AV| 99精在线| 国产乱妇无乱码大黄AA片| 五月丁香六月天| 色婷婷成人做爰A片免费看网站| 99热久久这里只有精品| 五月婷婷香蕉| www91久久| 在线天堂9| 色婷婷香蕉| 在线国产精品色| 色色色视频| 久久小视频免费| 亚洲激情免费视频| www.五月丁香| 婷婷久久网| 五月婷婷操操| 国产无人区大片| 99色色网| 噜噜噜精品欧美成人在线观看| 美女妹子后射视频网站在线观看| 天天干天天干天天干天天干天| 在线视频99| 五月激情小说网| 精品国产乱码久久久久久免费| 狠狠色中色| 国产无人区大片| 婷婷五月综合激情| 台湾佬天天日丁香婷婷五月天| 小视频久久久aaa| www色婷婷| 嫩BBB槡BBBB搡BBBB| 在线不卡AC| 99热在线资源| 777丁香六月青青草婷婷综合久月| 天天日天天日天天搞| 九九综合| 丰满少妇猛烈A片免费看观看| 任我肏视频精品| 97人人射| 99在线精品免费视频| 97人人干人人操| 黄桃AV无码免费一区二区三区| 99操网站| 五月天开心激情网色欲无码| 玖玖热视频| 色播五月网| 色婷综合| 久久99热免费| 丁香 久久| 无码人妻少妇色欲AV一区二区| 69人人操人人爽| 99精品久久| ss视频xx91| 丁香五月久久| av第一二区| 思思99精品视频在线观看| 天天色宗合| 99爱在线视频| 色五月大| 婷婷香五月综合激情| 情色五月天网站| 小香蕉av| 少妇丁香婷婷| 可以免费看AV网站| 一起草av| ,99视频久久| rr天天操| 婷婷六月综合| 99热精品在线| 激情五月六月婷婷综合啪啪| 图片区 小说区 区 亚洲五月 | 黄网在线观看免费| 大香蕉五月天婷婷| 婷婷社区五月天| 亚洲色色精品| 99久精品视频| 免费无码毛片一区二区A片| 99亚洲色色| 成人国产综合| 热99色| 2025色婷婷| 色婷婷9| 欧美成人AAA片一区国产精品| www.99成人视频| 亭亭色色五月天| 综合色、色综合| 九九AV在线| 丁香色啪综合| 中文资源在线a | 五月丁香福利| 九九九九九九九热| 超碰97干| 五月丁香婷婷激情图片| 久久婷婷亚洲| 69久久99精品久久久久婷婷| 狠狠色丁香婷婷基地| 激情综合丁香| 国产AV一区二区三区最新精品| 激情五月天啪啪| 夜夜做夜夜愛| 丁香婷婷人妻综合网| 99在线热| 丁香五月AV| 伊人大香蕉毛片| 婷婷五月天网| 九九热在线视频观看| 亚洲婷婷六月天| 丁香五月婷婷久久综合激情网 | 九九色综合| 9 9热这里有精品| 日本欧美成人片AAAA| 超碰激情网| 99热这里只有精品一区| 6080av| 天天做天天爰天天爽天天无遮挡| 色婷婷狠狠18禁| 日本久久99久久| 国内9l视频自拍老熟女九色| 丁香五月色| 丁香婷婷久久| 久久免费精彩视频| 操碰97| 丁香五月影院| 六月丁香啪啪啪| 天天爽天天爽| 第九色区av天堂| 五月丁香婷婷综合| 五月丁香六月| AA片在线观看视频在线播放| 婷婷六月丁香五月| 婷婷午夜| 日韩精品AV一区二区三区| 国产毛多水多女人A片| 无码少妇高潮喷水A片免费| 99ER热精品视频| 久久久国产精品黄毛片| 伊人99久久| 影院久久久| aaa9区免费在线观看| 超碰国产AV| 2017人人操| 亚洲免费观看高清完整版AV线| 天天色丁香| 这里只有精品免费在线视频| 天天综合久久| 国产激情久久久| 亚洲视频色色| 99国产在线精品视频| www.久久| 日日撸夜夜操| 亚洲午夜电影| 开心五月婷婷99| 久久精品国产一区二区三区四区| 婷婷五月天香蕉| 激情四射网| 精品操逼一区二区| 搡BBBB搡BBB搡18| 婷婷五月在线观看| 久热这里| 在线免费观看激情视频| 啪啪 综合网| 亚洲综合激| 情婷婷五月天| 五月丁香六月激情综合| 日本片日本片祼观看网站在线看中文版网页在线看| 亚洲精品久久久无码| 久艹久| 大香蕉520| 五月丁香另类网| 色综合久久88色综合天天99| 裸体做A爰片毛片A片免费| 大香蕉福利导航| 色婷婷色五月丁香| 五月丁香婷婷成人版| 天堂成人A片永久免费网站| 婷婷天天综合| 五月天婷婷情色| 亚洲AV人人操| 精品怡红九九九| 97色碰碰公开视频| a久久| 色丁香久综合在线久综合在线观看| 国产亚洲成AV人片在线观黄桃| 日本va欧美va欧美| 丁香激情网| 婷婷六月插屄激情| 五月天社区| 五月婷婷黄色| 97色五月婷婷在线| 人人看人人摸人人| 丰满少妇乱A片无码| 丁香五月成人网| 97se在线视频| 天天 青草 丝袜制服 在线| 久久婷婷五月丁香网| 蜜臀av粉嫩av懂色av| www.色五月| 99热免费观看| 中文婷婷狠狠| 五月天a婷婷伊人| 天天干天天干天天操| 精a品a| 五月天成人手机在线视频| 色偷偷综合| 日韩av网址大全| 亚洲激情另类| 色色丁香| 久久婷婷五月国产激情综合片| www.天天干| 激情五月婷色| 综合激情深爱| 狠狠久久婷五月综合色| 久久人妻高清中文| 午夜69成人做爰视频| 日本精品在线噜噜噜| 综合久久高清| 亚洲无aV在线中文字幕 | 中文字幕中文有码在线| 激情五月天在线观看色婷婷| 激情久久综合| 婷婷九九| 成人片在线播放| 国产91视频| a网站免费观看| 五月丁香色婷婷久久| 男人的天堂五月丁香| 狼人狠狠操| 久月婷婷| 五月丁香婷婷无码中文| www.久久99| 99精品爱| 综合网网欲色| 蜜臀av粉嫩av懂色av| 91人人网| 精品人妻伦一二三区久久| 秋霞学生妹一二级| 婷婷五月天丁香| 日本二级毛片二级毛片| 五月丁香婷婷久久| 色色日本| 99热免费18| 丁香六月婷婷综合麻豆| 九九99久久| www九九热| 极品少妇高潮啪啪AV无码| 天堂AV在线看| 九九re精品视频在线观看 | 久久久久久丁香五月| 人人插操| 久久色五月天| 九九视频这里是精品五月| www.lchjjc.com| 婷婷久久综| 亚洲AAAA网| 天天综合久久| 国产无遮挡又黄又爽免费网站| 久久丁香五月| 色欲久久综合| 色婷婷丁香五月| 久热亚洲| 女同激情久久av久久| 铁牛TV人妻| 五月婷婷啪啪综合网| 婷婷免费视频| 五月丁香婷婷综合视频| 色婷婷五月天天天天天| 99国产欧美视频| 五月婷婷婷婷| 久久九九色| 婷婷丁香五月精品| 六月丁香av| 中文字幕综合色| 人人摸人人干| AV网站免费在线| 色五XX| 99精品这里只有免费视频| 日韩美女在线视频19| 狠狠精品干练久久久无码中文字幕 | 亚洲综合激情五月久久| 激情纯色婷婷五月天在线不卡视频| 一级片sese片.COM| 亚洲日韩一页精品发布| 色色色婷婷五月| 99热国产精品| 日本97在线看片| 精品二区| 天天天天操| 成人亚洲精品| 亚洲色婷婷五月天| 丁香婷婷色五月天| 中文字幕丰满乱孑伦无码专区 | 中文字幕 久久9999| 久久99视频| 性热视频99精品| 精品九九久久| 牛牛热这里只有jingpin| 久婷婷婷| 色婷| 99这里有精品视频| 婷婷五月丁香六月天亚洲综合| 丁香五月六月久久综合| 欧亚洲在线高清视频| www.五月天婷婷| 婷婷欧美激情| 久久婷婷亚洲无码一起| 丁香,开心成人,久久| 99精品免费视频| 婷婷五月色| 超碰九色| 免费视频99| 1024操逼视频| 丁香五月婷婷AV| 国产成人+综合亚洲+天堂| 丁香五月成人婷婷| 激情五月婷婷| 91丨九色丨大屁股| 天天操夜夜操| 俺去也五月| 丁香五月激情图片婷婷| 成人AV播放| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 色娸娸综合网| 欧洲不卡视频| 婷婷五月天无码熟女| 五月丁香花伦理电影| 66精品成人免费网站在线观看| 亚洲第79页| 欧美性爱中文字幕| 婷婷午夜| 爱99干99| 亚洲视频国产一区| 天天爽天天爽天天爽天天爽天天爽| 婷婷五日b| 五月丁香成人视频| 欧美啪啪9| 亚洲第一成人无码A片| 亚洲人成网站999综合| 久操综合| 五月婷婷综合色啪首页| 九九婷婷网五月天| 色综合色色色| 激情五月天.色网| 五月丁香亭亭操逼| 婷婷狠狠五月综合| 五月伊人网| 2025神马午夜福利| 91操在线视频| 精品婷婷五月天| 性色五月天| www.久久99| 大香蕉 伊人夜| 爱爱色五月天| 五月之婷婷| 久久久久9| 日本偷拍九九九| 六月色婷婷色| 女人被男人吃奶到高潮| 夜夜撸夜夜骑| 99福利导航| 五月丁香六月婷婷综合伊人| 97色碰| 色欲婷婷五月天丁香| 五月丁香怕啪啪| 99ri精品在线| 五月天另类小说久久小说网| 五月六月婷婷激情网| 狠狠色激情在线| 九九九色综合| av在线免费网站 | 色九月综合| 久久综合激情五月天| 国产精品色婷婷久久久精品| 狠狠色噜噜狠狠狠狠狠色综合久久| 玖热精品综合视频| 99热国产精品| 五月天婷婷网站888| 夜夜谢天天干| 91精品综合久久久五月天| 深爱五月亚洲| 国产露脸150部国语对白| 99re思思| 九九久久精品| 人妻系列久久久久久久久久久| 97精品综合久久| 婷婷五月天大香蕉| 伊人婷婷五月| 天天干人人奸97| 狠狠操天天日| 伊人婷婷大香蕉在线| 天天操天天操天天操| 五月花婷婷| 成人欧美一区二区三区在线观看| 亚洲激情久久| 色色丁香五月婷婷| 国产毛片精品一区二区色欲黄A片| 久久久人妻人伦| 饮料下药迷倒漂亮女同事强干| 五月天大香蕉| 五月婷中文字幕| 91啪啪网| 伊人久久大香网| 97久久视频| 婷婷色网| 婷婷五月综合啪| 久久九九囯产| 99干视频| 五月婷丁香花| 国产欧美日韩综合精品一区二区 | 欧美成人AAA片一区国产精品| 久久综合激情五月天| 99精品无码| 久久久99精品| 成人免费网站免费看| 色丁香五月| 日韩三级片一区二区| 国产熟妇乱子伦hd| 99色精品| 天天爽爽日日做做| 国产,欧美,学生妹,视频| 99精品人人| 天天天天干| 99色色色色| 91爱啪啪| 91无码一区人妻A片蜜| 亚洲激情综合| A一级操| 亚洲色在线观看| 色情五月天A片| 99热播放| AV网在线| 中文激情网| 婷婷丁香色五月久久88| 五月丁香六月成人| 亚洲在线免费成人| 天天操屄网| 天天搞夜夜叫| 免费人人操| 99热精品在线观看| 天天操天天插| 噜噜噜色噜噜| 色婷婷色综合| 丁香色色网| 99热这里| 99热这里是精品| 婷婷五月激情的图片| 99原创自拍视频在线观看| 久久五月视频| 婷婷丁香五月婷婷| 中文不卡一二区| 五月天激情小说婷婷| 9久操| 少妇被下春药玩弄A片| 婷婷五月天综合久久| 天天爽天天摸人妻综合网| 怕怕av| 色婷婷综合久久久久| 五月天婷婷色综合| 人妻VideOssS人妻高清| 色婷婷五月婷婷五月婷婷五月| 99久久精彩视频。| 成人丁香五月| 五月亭大香蕉| 色播色丁香五月| 日本性视频| 国内熟女黄色系列| 五月天激情色色| 国产美女无遮挡裸体毛片A片| 一区视频网站| 色99网站| www.超碰在线| 婷婷亚洲色| 这里只有精品视频| 亚洲va欧洲va国产va不卡| 色五月激情综合| 99综合入口| 98热精品| 嫩草哈哈操| 9色在线视频精品观看| Www.久久| 91人人爽人人操| 五月天丁香花婷婷| 91se在线观看| 日韩精品一区二区亚洲AV观看| 大伊香蕉玖玖爱| 婷婷五月综合性爱| 99精彩视频在线观看| 欧美槡BBBB槡BBB少妇| 日韩AV免费看| 在线五月婷| 一级黄色操B| 97资源碰碰在线| 成人AV免费观看| 久久精彩综合视频| 五月天播播综合| 99精彩视频在线观看| 青青福利网| 婷婷五月天日日日干干干| 六月丁香射婷婷欧美色图片| 久久精品永久免费| 色播五月丁香| 欧美在线视频免费播放| 婷婷色网| 91嫩草国产线观看亚洲一区二区| 日本欧美成人片AAAA| 665566 无码| 五月久久婷婷丁香| 99色综合网| 激情亚洲五月| 色情免费视频播放| 亚洲A色| 超碰在线观看9| 综合激情婷婷| 性爱七区| 亚洲AV激情五月综合网| 婷婷五月天中文字幕| 丁香五月首页| 99热99艹在线观看| 91婷婷伊人牛牛| 色五月综合网| 亚洲六月婷婷| 亚洲婷婷五月天| enecarbon-materials.com污K127封锁请涟系@wip1688 | 涩综合在线| 激情五月图| 欧美va| 亚洲天堂aaa| 中文字幕人妻熟女在线| 丁香五月网| 日本性激情色播| 久久精品性爱| 色色五月婷婷久久| 免费五月婷婷网| 欧洲第一无人区观看| 亚洲国产成人AV在线 | 国产精产国品一二三在观看| www99久久| 天天爱天天做天天爽| 丁香五月激情综合| 色五月婷婷综合在线| 丁香五月婷婷激情蜜桃| 欧美激情综合五月色丁香| 偷偷狠狠久久婷婷五月天| 婷婷五月天在线视频网站| 日韩日比视频在线| 精品少妇蜜臀91| 亚洲综合色成丁香五月色| 26uuu欧美日本| 国产精品成人在线| 99久久婷婷国产综合精品草原| 欧美日韩91| 久久99免费视频网站| 香蕉久久国产AV一区二区| 激情综合五月激情XXXX| 久久机热/这里只有精品| 婷婷大香蕉| 久久艹网| 五月激情基地| 国产看真人毛片爱做A片| 久久五月天精品视频| 五月婷激情| 狠狠色婷婷7| 国产熟妇乱子伦hd| 日日操日日射| 国内久久婷婷| 天天爽天天干| 91爱啪啪| 日日日日日| 青草性爱视频| 91无码一起草| 欧美大道不卡| 超碰在线看| 99热这里有精品| 凹凸操Av| 日本久久婷| 精品色色| 亚城区在线| 香蕉综合在线| 无码激情AAAAA片-区区| 狠狠干综合网| 久久人操-久草婷婷-成人AV| 性色五月天| 极品色丁香| ..真实国产乱子伦对白在线_欧| 色综合色综合色综合| 五月婷婷黄网站大全| 狠狠色情婷婷| 99国产精品久久久久久久久久久| 狠狠xx| 性按摩玩人妻HD中文字幕| 操逼棍操逼| 六月婷基地| 婷婷五月丁香基| 99爱这里只有精品免费视频| 丁香 婷婷五月| 午夜成人av在线| 婷婷五月天成人综合网| 五月婷婷色在线| 日本五月婷| 任你爽视频| 伊人激情| 狠狠色噜噜| 亚洲啪啪精品| 丁香五月瑟瑟| 91VIP在线观看| 色五月色五天免费视频| 国产在线激情视频| 丁香六月婷婷综合麻豆| 九九操操| 97人人干| 亚洲激情五月婷婷日日| 婷婷影视久久| 337p大胆噜噜噜噜噜91Av| 婷婷丁香五月欧美人| 久久女人天堂| 国产性爱色| 嫩草AV久久伊人妇女超级A| 一级精品999WWW| 99热精这里只有精品| 久久色情| 久久一品区| 日本激情综合| 狠狠综合| 色狠狠综合| 涩涩涩婷婷| AV伊人青草丁香六月| 欧美WW在线网| 97超碰在线观看免费| 99ER热精品视频| 26uuu精品国产| 婷婷丁香花五月天| 五月天激情电影| 91精品国产综合久久密臀| 日本美女天天日天天爽| 操一区| 国产精品国产| 性爱激情综合网| 中文字幕无码AV| 成人无码精品1区2区3区免费看| 婷婷.com| 这里只有精品网| 激情综合色| 狠狠撸激情综合丁香五月天俺来啦| 西瓜美女a片| 少妇口诉沐足视频播放器网址| 久久婷婷五月草视频在线播放| 久久亚洲色导航| 深爱五月综合网| 激情综合网之激情五月| 袁子仪视频观看| 性爱在线播放av| 婷婷日| 久久色五月天综合网| 天天情色五月天| 男人的天堂五月丁香| 五月天播播中文字幕| 狠狠狠色激情综合适合| 蜜臀99精品| 色婷婷丁香五月| 六月综合婷婷开心伊人| 激情99| 亚洲宗合激情| 婷久久高清| 丁香五月天婷婷91| 婷婷五月天色色| 五月丁香婷婷无码中文| 逼逼AV| 成人综合伍月天| 人人射人人高潮| 色婷婷五月综合在线| 日本丁香五月| 婷婷色五月综合| 婷婷丁香www视频日本韩国| 小色小蛇伊人婷婷色香五月| AV在线大香蕉| 国内裸舞二区| 天天狠狠六月婷丁香影院| 伊人婷婷大香蕉| 深爱五月婷婷| 婷婷五月色情| 袁子仪视频观看| 99热首页| 婷婷狠狠五月综合| 狠狠色综合网| 少妇人妻丰满做爰XXX| 9伊人网| 另类的婷婷| 99re热在线视频观看| 五月天激情网站| 成人一区在线观看| 久久与婷婷| 99热97| 五月天婷婷久久| 六月丁香成人| 色婷婷狠狠干| 亚洲成人av在线| AⅤ网站在线看| 九九色欲网| 色综合天天天天做夜夜| 热久久99热欧美国产亚洲| 五月久久综合| 精品综合久久久久久五月天| 亚洲第一综合| 五月开心播播网| 日韩欧美一区二区三区四区| 思思久久精品| WWW.HENHENL.| 久久五月丁香激情综合| 91精品婷婷国产综合久久| 激情熟女网| 婷婷中文字幕版| 五月丁香激情啪啪| 99亚洲视频| 五月婷婷说| 99日热在线视频| 婷婷丁香五月精品| 久草婷婷| 99久久66| 啪啪综合网| AV在线资源| 色色色色色色色色色色色色色97| 97久久超视频| 中文字幕婷婷五月天在线观看| 少妇AB又爽又紧无码网站| 新99思思视频| 99re8在这里只有精品| 人人人操Av| 夜夜骑夜夜撸| www.91.com黄| 996热| 91成人品| 亚洲色另类| 五月激情丁香久久综合网| 97人人草| 婷婷丁香五| 五月天电影网| 色五月五月婷婷| 九九色热视频| 久久九九@| 激情五月婷| 欧美色色色| 色狠狠综合网| 大学生高潮无套内谢视频| 色五月亚洲开心网| 婷婷久久18| 亚洲色五月| 色性五月天| 丁香激情网| 大战熟女丰满人妻AV| 婷婷五月无码| 色五月天丁香| AV片一区在线观看| 亚洲无码11| 2020久久婷婷五月| 五月丁香综合精品欧美| 五月丁香AV在线| 色婷婷影| 国产午夜精品一区二区三区嫩草| 成人av播放| 国产一区二区av免费| 99视频在线精品| WWW色综合| 青青操日本摸摸看看| 91精品久久久久| 六月婷婷七月丁香| 强伦轩人妻一区二区电影| 五月天婷婷影院| 久色中文| 五月婷婷激情综合| 久久无码成人| 99精品自拍| www.激情五月天com| 丁香大香蕉| 丁香五月天天久久综合小说| 色碰碰| 激情五月综合六月丁香婷婷狠狠干| 五月婷综合| 国产精品色色| 五月婷亚洲精品| www。五月天。com| 久久久五月五丁香| 欧美日韩色色| 99久久6| 五月天精品| 激情亚洲色图片丁香综合| 色五月综合网| 日韩在线99| www.99情趣网| www.色窝| 精品一二三区视频立| 亚洲视频国产一区| ..真实国产乱子伦对白在线_欧| 日熟女| 五月丁香六月花| 日韩五月天婷婷| 九月婷婷久久久| 991国产精选视频在线播放下载| 又大又粗九一在线| 成人国产欧美大片一区| 91久久久久久久| av网址在线| 天天色天天日天天舔| 色久五月天| 小视频一区| 蜜臀嫩草| 五月色丁香国产在线视频| 色爱99| 密黄站| 九九热免费观看视频| 色色婷| 97色色色色| 在线播放成人网站| av 一区三区四区| 色五月偷偷| 97色婷婷五月天| 棕合影院色色| 中美日韩成人在线| 五月色综合| 丁香六月婷婷久久综合| 综合天天综合| 久久精品爱爱| 五月激情婷婷色| 亚洲综合色丁香五月天| 国产色五月| 丁香婷婷视频| 超碰日日操| 99视频精品| av大香蕉| 国产人妻777人伦精品HD| 99热热热天天人人人超超碰| 丁香六月成人| 玖玖色资源| 五月丁香婷婷基地| 五月婷婷开心爱| 69激情小说| 99热这里| 激情丁香五月婷婷| 婷婷激情五月呦呦| 91岛国片| 日本va欧美va欧美va精品| 日在线V视频在线播放| 色婷婷九月| 三级三久久线久久99久目本WW| 人人操AV| 五月天色站| 丁香五月亚洲AV|