SceneGraph概念的理解
在 VTable 中,配置管理者BaseTable,通过创建 Scenegraph 实例,将表格的配置转化为具体的渲染场景。
而Scenegraph(场景树) 正是这个转化的载体。场景树是一个比较抽象的概念,在我的理解里,场景树可以理解成一个层次化的图形组织结构、一个精密设计的蓝图、能够将抽象的配置转换为具体的可交互、可渲染的图表节点网络。正如它的名字,这种树结构,由于更新时不需要重新计算要绘制的图形,只需要对相应的场景树节点进行属性更新,会有更高的性能。
在场景树每个节点( Group 和各种图形元素如 Rect、Text、Icon)都是一个"图形单元",节点之间存在父子、层级关系,每个节点可以有自己的属性和行为。这些节点相互嵌套、关联,共同构成了一个完整的、可动态更新的表格系统,整个树的变化会即时反映在最终的渲染结果上,就像组织架构的调整会影响整体运作。
场景树的核心设计理念在于它提供了一种结构化、可管理、高效的方式来组织和渲染复杂的图形界面。
BaseTable
可以观察到:在package/vtabvtable/src/core/BaseTable.ts中声明了 BaseTable 基类(VTable中具体表格类的父类),在 BaseTable 基类构造函数中有:
//省略其余代码 class BaseTable { constructor() { // 创建 Scenegraph 实例,并传入 BaseTable 实例 this.scenegraph = new Scenegraph(this); } release(){ // 图标注销时清理场景树 this.scenegraph = null; } }
将 BaseTable 实例(this)作为参数传递给 Scenegraph 构造函数,创建了 Scenegraph 实例。
而在package/vtabvtable/src/scenegraph/scenegraph.ts内,Scenegraph的构造函数也注册了
table:BaseTableAPI实例:
export class Scenegraph { // 表格实例的引用 table: BaseTableAPI; // 舞台实例 stage: IStage; // 。。。场景树的其他属性 constructor(table: BaseTableAPI) { // 将传入的 table 实例保存为类的属性 this.table = table; // 。。。其他操作 this.initSceneGraph(); // 准备场景树的基本结构 // 。。。其他操作 this.createComponent(); //为表格准备"选择"和"组件"相关的基础设施 } // ... 其他方法 }
可以看到,Scenegraph是 BaseTable的一个核心组件,其中scenegraph控制的是表格的交互和渲染,而BaseTable负责控制一个图表的基本配置管理和整体逻辑,BaseTable管理了 Scenegraph的生命周期,操作着场景树的创建和销毁。
同时,两个类同时需要访问对方的属性或方法:场景树需要拿到table的渲染配置和基础信息(options、animationManager、theme等等等等基础配置)来搭建stage,而 BaseTable又依赖 Scenegraph提供渲染和交互的核心方法。
相关源码位置
-
package/vtable/src/core/BaseTable.ts: 场景树核心类的定义文件
-
scenegraph/group-creater/progress/proxy.ts: VTable 应对大数据量渲染挑战的核心性能优化模块。
数据结构内部概念解读
上面提到场景树是树状结构,而其中的主要构成元素是组-列-单元格-图元,大致的结构如下所示:

Stage
Stage是来自VRender模块的一个概念(https://visactor.com/vrender/guide/asd/Basic_Tutorial/Create_Instance),是场景树的顶层容器和渲染环境,可以理解为一个虚拟的"画布空间",它负责提供渲染的基础环境、管理整个场景的渲染流程、控制场景的基本属性(大小、背景、像素比)等。
- 舞台搭建:
constructor(table: BaseTableAPI) {
// Stage 创建
this.stage = createStage({
canvas: table.canvas,
width,
height,
// 其他配置...
});
}
对于 VTable 来说,Stage 是构建整个表格可视化系统的基础容器。
- 场景子节点渲染到画布
this.stage.defaultLayer.add(this.tableGroup); (this.stage as any).table = this.table;
首先将表格的根节点(tableGroup)添加到 Stage 的默认图层,这意味着 tableGroup 及其所有子节点将被渲染到画布上,建立了场景树与渲染环境的直接连接;
然后把table实例挂载到stage上,建立了与table配置的相连接。
Group
group是场景树类中的重要组成部分,形象的来理解,group是sceneGrapg树形的结构中的树结点,又是图元的组织管理的容器结构;
表格的复杂性决定了场景树需要多个 Group,例如:
-
colHeaderGroup:管理列头 -
rowHeaderGroup:管理行头 -
cornerHeaderGroup: 列表头冻结列Group -
bodyGroup:管理主体内容 -
rightFrozenGroup:管理右侧冻结区 -
bottomFrozenGroup:管理底部冻结区
图元
图元的概念来自VRender中,是基础的渲染元素,可以组成VTable中的实际表格内容(radio,chart,checkbox等元素),例如checkbox可以堪称是由Symbol图元和Text等图元的组合:

ProgressProxy
ProgressProxy 是 VTable 的性能优化核心,通过在首屏渲染时控制节点生成、增量加载和节点位置更新的管理。
是VTable实现大数据量下首屏和交互时的性能优化的核心模块。
设计理念
Scenegraph模块的设计理念是用场景树来负责表格场景节点的创建与更新,表格整体场景节点是基于VRender提供的图元创建的场景树结构,按照表格->表头/内容->列->单元格->单元格内容的组织顺序,一层层构建而成。