Worker、主线程 与 渲染

选择并运行 Sixtyfold Charts 的共享 Canvas2D 渲染路径。

Sixtyfold 采用单一 TypeScript 渲染设计,包含三种宿主:一个 OffscreenCanvas Worker、一个异步主线程适配器,以及服务器端渲染入口。Canvas2D 是唯一的图形后端。

渲染器选择是 LineChartOptions 与 StockChartOptions 的一部分。解析得到的模式可从 chart.getRenderMode() 获取。

自动选择

renderMode: "auto" 在浏览器支持 Worker、OffscreenCanvas 和画布传输时偏好使用 Worker。当这些能力缺失或 Worker 构造被同步阻塞(包括受限的内容安全策略导致的阻塞)时,回退到主线程。

const chart = new LineChart(canvas, { renderMode: "auto" });
await chart.initialize();

console.log(chart.getRenderMode()); // "worker" or "main"

renderMode: "worker" 表示偏好,而非承诺;当无法启动 Worker 渲染时仍会回退。有关遥测和支持信息,请使用 getRenderMode()。

Worker 模式

Worker 模式会将画布和大量类型化数组缓冲区的控制权转移出去。对于交互式的数百万点图表,这是首选路径,因为层级构建、剔除、布局和绘制不会占用浏览器的 UI 任务。

主线程回调(例如自定义提示工具渲染)接收的是紧凑的渲染器消息,而非对 Worker 状态的直接访问。请保持回调的确定性并尽快返回。

主线程模式

在测试环境、缺少可转移画布的浏览器、禁止 Worker 的严格宿主,或对集成简洁性优先于 UI 线程隔离的小型静态图表中,请使用 renderMode: "main"。

主线程适配器有意异步传递渲染器消息。不要假定调用 setData 时其首帧已同步完成;当帧完成很重要时,请使用统计或应用级就绪 UI。

发布检查通过主线程路径和 Chromium、Firefox 以及 WebKit 中的生产默认 auto 路径对 Line 和 Stock 进行测试。在支持的引擎上,auto 解析为一个 OffscreenCanvas Worker。强制 Worker 的契约也在 Chromium 中运行。这是为了验证兼容性,而非保证与设备无关的帧率。

尺寸与 DPR

通过布局设置画布的 CSS 宽度和高度。Sixtyfold 会监测元素尺寸和设备像素比的变化,然后更新后备存储和渲染器布局。当宿主以无法立即观察到的方式更改布局时,resize() 仍然可用。

避免仅设置画布的 width 和 height 属性以实现响应式图表。这些属性属于后备存储值,而 Sixtyfold Charts 的公开尺寸和样式字段使用的是 CSS 像素。

内容安全策略

生产环境中常见的严格策略通常需要:

default-src 'self';
script-src 'self';
worker-src 'self';
img-src 'self' data: blob:;
connect-src 'self';

请根据应用进行调整,不要盲目复制此示例。远程覆盖图像需要其来源在 img-src 且具有兼容的 CORS 响应头。

可见性与清理

当图表不可见时,浏览器会暂停或避免不必要的工作。可选的 Safari keep-alive 间隔默认禁用,仅当在目标 Safari 版本上重现资源回收问题后才应启用。

在永久丢弃画布之前始终调用 destroy()。在单页应用中,框架的清理钩子是正确的位置。

框架就绪回调用于确认初始化和初始属性成功设置,而不是确认画布已绘制帧。React 19.2+ 的 Activity 隐藏会保留已挂载的渲染器及其内存,直到实际卸载;它不是 Worker 释放的边界。参见 adapter 生命周期约定,其中说明了隐藏引用、延迟回调和错误恢复。