数据模型与所有权

类型化数组的形状、校验规则、缺口以及 Worker 的传输所有权。

Sixtyfold 接收每个数值字段为各自的 Float64Array,而不是以百万行对象的形式。此列式布局使得传输到 Worker 和渲染变得可预测。

下列形状是 line 方法stock 方法 接受的输入。

折线数据

单系列数据集具有一列有序的 X 和一列 Y:

interface TimeSeriesData {
  x: Float64Array;
  y: Float64Array;
  length: number;
}

多系列数据在每个系列间共享 X:

interface MultiSeriesData {
  x: Float64Array;
  series: Array<Float64Array | {
    low: Float64Array;
    high: Float64Array;
    y?: Float64Array;
  }>;
  length: number;
  seriesCount: number;
}

仅在 rangeband 系列中使用范围对象。lowhigh 定义包络;可选的 y 提供其显式中心描边。当合成中点会产生误导时,省略 y 或将系列宽度设为零。

X 值必须为有限且递增。时间戳为普通数字;以纪元毫秒为单位是惯例但非强制。minViewportRange、视口值、标记时间戳以及所有其他 X 域选项使用与 X 相同的单位。

在 Y、range-low 或 range-high 数组中使用 NaN 表示真实的缺失观测。连接渲染器会断开路径,而不是穿越缺口绘制。

OHLCV 数据

interface OHLCVData {
  timestamp: Float64Array;
  open: Float64Array;
  high: Float64Array;
  low: Float64Array;
  close: Float64Array;
  volume: Float64Array;
  length: number;
}

所有六列必须对齐且至少包含 length 个条目。normalizeOHLCVData 接受递增或递减的时间戳。递增输入保留其数组;递减输入会被复制并反转,且不会修改调用方。

不要仅为使时间戳规则化而合成交易所收盘或缺失的行情区间。timeScale: "market" 在视觉上压缩缺失区间,而标签、事件和标记保留其真实时间戳。

缓冲区所有权

在 Worker 模式下,大批量的 setDatasetMultiSeriesDataaddVectorsStockChart.setData 和股票批处理 API 会将类型化数组缓冲区传输到渲染器以获得最快路径。被传输的缓冲区将变为分离状态,调用方不得读取或重用。

当应用必须保留自身副本时,请显式克隆:

chart.setData({
  x: sourceX.slice(),
  y: sourceY.slice(),
  length: sourceX.length,
});

不要依赖主线程回退行为来保留所有权。即使渲染器的解析结果不同,也应将批量输入视为已传输,以免更换浏览器或 CSP 策略改变应用正确性。

流式传输

折线流使用以 initStreaming(seriesCount, maxPoints) 初始化的固定大小环形缓冲区。股票流使用 initStreaming(maxCandles)。一旦达到容量,最旧的观测将被替换,同时保留时间顺序渲染。

当数据已按列到达时,使用向量或蜡烛批处理方法。单条观测方法通过 requestAnimationFrame 进行批处理,适用于适度的实时速率。