!!!###!!!title=2.1 场景树(Scenegraph)概念解读——VisActor/VTable 社区贡献者文档!!!###!!!!!!###!!!description=---title: 2.1场景树(Scenegraph)概念解读 key words: VisActor,VChart,VTable,VStrory,VMind,VGrammar,VRender,Visualization,Chart,Data,Table,Graph,Gis,LLM--- !!!###!!!

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();   //为表格准备"选择"和"组件"相关的基础设施
  }
  // ... 其他方法
}    

可以看到,ScenegraphBaseTable的一个核心组件,其中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提供的图元创建的场景树结构,按照表格->表头/内容->列->单元格->单元格内容的组织顺序,一层层构建而成。

本文档由以下人员修正整理

玄魂