【視覺化-原始碼閱讀】antvis / g-base解讀 - 1

wlove發表於2022-02-22

前言

分析大佬所寫的程式碼有助於個人成長。今天來分析學習一下G的內部實現 版本為 0.5.1。(其實我就是想偷偷卷 不為別的)。

程式碼是其次 背後的設計 思路 落地方案才是重中之重; 開始原始碼分析之前先看看g的技術方案(以及擷取一張內部開發人員的自我評價..) [各個渲染模式不同的入口,不同版本的 G 都有 Canvas、Group 和 Shape 的實現,通過統一的 interface 對外提供支援。】

image.png

image.png

開始我們的原始碼征途

1. 選擇對應tags所在分支原始碼[0.5.1]的原始碼(我看到G6是用的這個..)

image.png

2. 檢視一些工程方面的東西 看看怎麼下手

  • package.json 檢視了一些相關指令 用到lerna這個包管理 嗯 - -, 不是重點 接著往下。

image.png

  • lerna.json下面檢視一下packages,可以理解原始碼大概包含了幾個模組。分別是g-base g-canvas g-svg g-math。

image.png

3. 一起去看看內部的原始碼

進入packages目錄下,看到了這幾個檔案。這裡按我所瞭解的描述下每個的模組職責。

image.png

  • g-base
    繪圖所需內容進行了介面定義並實現。
  • g-canvas
    2D渲染圖元封裝以及互動實現 canvas
  • g-math
    對於幾何圖形的一些運算進行封裝實現
  • g-svg
    2D渲染圖元封裝以及互動實現 svg
  • g-webgl
  • g-mobile
    webgl和mobile這個版本沒有內容,待完善不介紹。

深入分析下g-base

繪圖所需內容進行了介面定義並實現。

內部結構

image.png

  • abstract
    內部概念的抽象/定義, 包含 element group,shape這些。
  • animate
    動畫.... 關於動畫註冊 銷燬等等... 用到了D3-timer 和 d3-ease... 關於動畫數學那塊。
  • bbox
    關於各類shape的座標處理,大小處理 集合方面的。 circle,ellipse,line....
  • event
    畫布事件相關建立,銷燬 'mousedown','mouseup','dblclick'.....
  • util
    工具類庫...說實話這塊好全(- -,) createbox,color,matrix...
  • index.ts
    整體入口
  • interfaces.ts
    所有介面的定義,預覽這個檔案 可以看到內部支援和所暴露的API
  • types.ts
    內部"結構體"的型別定義 比如BBox,SimpleBBox ,Ponit這些。

拿幾段程式碼看看...

目錄: g/packages/g-base/src/event/event-contoller.ts / 看下實體的拾取 這個優化空間很大。但是我沒看完。他這個概念好像也沒什麼優勢。。有懂得可以交流下。

image.png

image.png

  1. _getShape只是為了抽離出getShape。getShape才是拾取程式碼的邏輯
  2. _getPointInfo 獲取點資訊 然後去碰撞
    看了下實體的拾取,因為G內部每個圖元有box的概念 所以其實就是邊界碰撞。 嗯 好像也沒什麼。 要看內部的bbox,我這邊可能沒太多時間去看。有想討論可以加我視覺化群聊。

深入分析下g-canvas

內部結構

image.png

g-canvas 2D渲染圖元canvas封裝以及互動實現
  • shape
    各類渲染形狀 圓/橢圓等等..
  • util
    各類工具 關於實體捕獲的 是否在路徑in-path 是否在圓內... 等等
  • canvas.ts
    canvas基本操作 get,draw/drawAll..,clear...等等
  • group.ts
    group-shape的實現 (一個渲染圖元概念)
  • index.ts
    整體入口
  • interfaces.ts
    所有介面的定義,預覽這個檔案 可以看到內部支援和所暴露的API
  • types.ts
    內部"結構體"的型別定義 比如BBox,SimpleBBox ,Ponit這些。

找程式碼看看

區域性重新整理繪製

image.png

區域性重新整理繪製。 清除指定區域 然後save; 然後進行clip(路徑剪下) 將子元素繪製在剪下路徑內。 嗯 就是區域性繪製。效能考慮吧。 不過個人覺得分層離屏會好點。。

G的其他部分就先不分析了.. 比如g-svg和Canvas設計實現出於一個目的,只是API實現方面的細節問題.大家可以仔細閱讀。

最後

2022/02/22 記錄一下。

最後一個好訊息:2022/02/25晚上在群內直播D3相關原始碼閱讀分析分享。

相關文章