v0.11.0-alpha.8
相比 v0.11.0-alpha.7 的变更
新功能
- 第三方渲染层注册(破坏性): 新增 Controller 级 Layer 操作(注册、查询、移除、启用开关、请求重绘)与插件渲染能力,注册名开放为第三方字符串,同一 Controller 与插件共用
ChartRendererAccess,Scene 成为已挂载 Layer 的释放所有者。 - 价格轴滚轮缩放与光标价格锚点: 价格轴画布位于绘图区之外,宿主滚轮监听收不到轴上事件;改为 core 按事件目标分流,以 PriceScale 在原生刻度空间补偿中心位移实现锚点缩放,线性、对数、百分比刻度共用同一套锚点规则,
Chart.scalePrice新增可选锚点参数。 - 统一可移动的价格轴设置菜单: 将价格轴控制项收敛为向上展开的菜单,含当前模式勾选与左右侧放置,重置时按可见高低点重算纵向范围并保留所选刻度与范围模式;移除图表设置弹窗中的轴控制项。
- 价格轴悬浮快捷切换刻度: 鼠标悬停价格轴时在轴按钮上方显示 A/L/% 快捷切换,复用菜单命令,指针移出即隐藏。
- 可选主题预设: 新增可选主题预设(配色板 + 视觉主题),点击即应用并持久化,图表在弹窗保持打开时重渲染;预设只调整配色,不改其他设置。
- 绘图模板画布浮条: 在画布浮条直接保存与应用图元样式模板,共用既有的按类型 IndexedDB 模板契约,应用模板只写入共有颜色字段并经
updateBatch;单选时才提供保存。 - 图元复制: 新增画布工具栏按钮与
drawings_copyAgent 工具,通过同一 core 入口复制单选或多选图元;副本保留类型、样式、标签与参数,获得全新 ID 并可见未锁定,替换选中以便直接拖动,按时间轴 16px、价格轴 48px 偏移且近边缘翻转,整组记录为一步撤销。 - 图元显隐与批量删除: 新增图元显隐开关(含 Agent 历史联动)以及批量删除与虚线框选图标的工具栏入口,替换原先的删除入口。
- 连续绘制开关与磁吸工具栏(破坏性): 左侧工具栏磁吸旁新增连续绘制开关,完成图元时保留当前工具;磁吸模式三档接入左工具栏,强磁吸改为无条件取最近 OHLC 价格,移除
MAGNET_RADIUS_STRONG。 - K 线收盘倒计时按交易时段推算: 倒计时改为解析当前品种注册的交易时段,日内周期按交易区间步进并跳过午休、收盘截断最后一根,日线结束于当日收盘;新增
showLastPriceCountdown设置项(默认开启),关闭后不再派生文本并停止秒级刷新。 - 未来区交易日历与时间外推: 新增
projectTradingTimestamp纯函数按MarketSessionConfig.tradingDays外推未来时间,未来区时间轴刻度与纵向网格由日历驱动,无日历时以T、T+1、T+2相对索引占位,十字线与横竖绘图锚点共用同一外推入口;MT5 会话补注册,跨视图缩放锚点跟随指针槽位。 - 未来区可滚动与十字线外延: 指针越过最后一根 K 线时十字线按尾部槽位步长吸附未来槽位,滚动上限按未来区屏数放行,缩放后不再被拉回数据右缘。
Bug 修复
- 共享 GPU 后端绘制区域错绑:
ChartRenderer在构建帧时依次调用所有 Pane 的beginFrame后才scene.paint,共享 GPU 后端绘制时仍绑定最后一个 Pane,导致主图 K 线被画到副图区域;FramePaint改为携带 SurfaceRegion 与后端,由 Scene 在分发每批次图层前绑定区域并传递 clear 标志,Overlay 批次保持clear: false。 - 拖拽图元时跳帧: 帧去重只比较正式文档,导致拖拽过程被判定为未变化而跳帧,只有抬起后才跳到落点;每个 Pane 增加正式图元画布,正式层按 committed 投影复用几何与像素,会话层消费拖拽覆盖、预览与框选。
- 切换品种后价格轴停在旧区间: 锁定价格对 K 线比例时切换品种会沿用上一个品种的手动范围快照与纵向变换;现在主品种身份变化时由 kernel 原子提交品种并清空手动范围,新行情首个有效帧据此重算自动范围再继续锁定。
- 主图图例配置失效: Vue 图例配置调用了已移除的
updateRendererConfig,图表挂载即抛TypeError中断;改为经updateOptionsFacade写入 chart options,由optionsState统一持有,两个图例 Layer 每帧读取配置快照。 - 最新价标签未按刻度格式化: 标签硬编码价格文本,切到百分比刻度后仍显示价格;改为与刻度、十字线价签共用同一显示语义解析器。
- 未归一化品种被判数据源不支持:
unknown的 assetClass(如 GoTDX 恒指 HSI)不在源声明范围内,整源被判不支持,Router 在请求前抛SourceRoutingError;新增唯一判定入口isFilterableAssetClass,registry、router 与 protocol 三处筛选点统一复用。 - 十字线标签对比度不足: 三处十字线标签使用通用 label token,深色下底色近黑导致标签糊在轴背景;回归专用的
crosshairLabelBg/crosshairLabelText(对比度 8.79:1),浅色模式不变。 - MT5 未来区时间外推整体失效: 内建会话注册表缺少 MT5,品种会话解析抛错使
futureSession恒为 null;补注册MT5 -> FOREX_MARKET_SESSION(24/5 主场景)。 - 水平图元锚点携带 futureOffset:
completeDrawing无差别传{ timestamp, futureOffset, price },与水平锚futureOffset?: never的契约冲突;改为水平命令仅传 price,未来区落点可按价格创建水平线。 - 绘图时十字线消失: 绘图预览先消费指针移动导致十字线被隐藏;改为绘图期间保留悬停更新并以虚线渲染两条标线。
- 默认 K 线提示框空白: 提示框挂载即渲染,而可见性只在订阅内解析(订阅时不触发);改为初始隐藏、setup 时求值一次,数据变化时重新求值。
- Android WebView 不跟随系统主题: 补充系统主题跟随判定,使 WebView 内嵌场景也能随系统深浅色切换。
- 下拉触发器文字下沿被裁切:
dropdown__value同时使用line-height: 1与overflow: 隐藏,省略号裁切区截断了字体下沿笔画;改为1.4。 - 领域错误码常量缺失: SCALE_/FOOTPRINT_/AVWAP_/INDICATOR_/HEATMAP_/MTF_/CHART_TYPE_/REPLAY_/DEPTH_ 错误码引用了
errors.ts未导出的常量对象,导致 core 无法通过类型检查;补齐常量并统一文件格式。
架构与重构
- Layer 成为 Scene 唯一绘制契约(破坏性):
Layer<TFrame>/Scene<TFrame>泛型化,Layer.pane用具体 paneId 取代丢弃 id 的 paneRole,Layer.paint直接接收帧上下文;pane 匹配、可见性、role 过滤、z 排序与逐 Layer 异常隔离上移到createScene,Scene.paint(frame)一次画完所有 pane。 - 退役 RendererPlugin(破坏性): 删除
RendererPlugin/RendererPluginWithHost、RendererPluginManager、updateRendererConfig与createLayerFromPlugin/wrapRendererAsLayer;约 70 个渲染器工厂与指标 scale 统一返回原生Layer<RenderContext>,指标接缝集中到indicatorRendererLayer.ts,状态统一经context.indicatorStateReader读取。 - 未来区空间由视口派生(破坏性): 移除
futureScreens图表选项,改为响应式几何统一派生内容宽度、滚动上限与未来槽位数,并保留末尾两个数据槽位,使平移无法把视口整体移入未来区;默认未来区由 3 屏收窄为 1 屏。 - 图表视图切换集中化(破坏性): 周期与对比视图经同一决策解析,使对比命令保留分时模式;重写几何、价格轴与指针编排并移除影子状态,
Chart.applyRenderState改接受zoomLevel或kWidth/slotWidth,Chart.setSymbols拒绝多个主品种(对比改用setComparisonSpecs)。 - 命中测试几何归入 foundation/geometry(破坏性): 新增业务无关的
foundation/geometry作为 2D 值类型与纯谓词的唯一归属,替换绘图、marker、自定义 marker 形状、K 线/窗格判定与框选各自重写的 point-in-circle、AABB、两点成矩形与线段/矩形求交;ScreenPoint更名为Point并下沉,engine/drawing不再导出ScreenPoint。 - 绘图模板领域归入 core: 模板读写(types/impl/codec + IndexedDB store)从 Vue 层的两套并存实现收敛到 core,模板列表按「仓库实例 + 图元类型」共享为唯一状态源,样式与文本位置解析拆为
resolveTemplateStyle与resolveTemplateLabel,菜单行操作抽到DrawingTemplateMenu供画布浮条与设置弹窗共用。 - Provider 模块语义分层: 数据层按
types.ts + impl/布局重组,并将packages/core/src/data的硬编码字符串替换为具名常量(AUTO_SOURCE_ID、LATEST_TRADING_DATE、OLDER_DATA_STATUS.EXHAUSTED、V1_ENDPOINTS、JSON_HEADERS、CN_SESSION_ID)。 - 内建数据源注册单一真源: 内建源清单集中到 core(
provider/sources/index.ts),以market-data/sources/语义子路径与逐源深导入暴露,取代dist路径通配导出;web-component 入口改为强引用内建源,避免被sideEffects: falsetree-shake 掉,并补静态 capabilities 让无头引导不再死锁。 - 绘图工具与磁吸常量集中化: 从绘图契约发布
DrawingTool与MagnetMode表并派生类型,交互层、工具表与 Vue 工具栏的运行时比较点统一消费。 - 倒计时时间并入帧输入: 倒计时此前在 timer 延迟、帧去重版本键与 paint 内三处各自现取
Date.now();改为在 derive 开始时从可注入 Clock 读一次并随快照下发remainingMs与countdownText,版本键改用派生文本,timer 由帧事务副作用阶段统一续订。 - 帧内容版本化:
ChartRenderer在帧事务 derive 阶段按值比较(Object.is)主层与交互层内容版本,命中即跳过 prepare、清屏与绘制;仅交互层变化时复用缓存几何只重画 overlay,主层像素保留。WebGL 上下文启用preserveDrawingBuffer保证跳帧期间可见内容持续显示。 - Vue 组件逻辑抽取: 将
KLineChart.vue内联的默认提示框逻辑抽为useKLineTooltip、交互订阅抽为useInteractionBridge,并在卸载时取消订阅与断开 ResizeObserver。 - 工具栏按钮共享样式: 抽出
control-button.css统一品种选择、比较按钮与下拉触发器的尺寸、主题色、悬停、展开态、焦点环与窄屏降级,Dropdown 继续通过--dropdown-trigger-*支持主题定制,工具栏阴影改由 UI token 派生。 - BaseTooltip 统一悬浮提示: 原生
title无法主题化且与 DropMenu 封装行为不一致,价格轴快捷按钮、Agent 头部按钮与 Dropdown 触发器改由 BaseTooltip 渲染,Dropdown 新增ariaLabelprop。
性能
- 图层几何保留与整帧跳过: 数据与视口不变时仍逐帧重建 K 线/Ichimoku 几何并全量重画;新增
retainedGeometry(按 key 保留几何并计数重建)与retainedProjection(合成 dataRevision、展示输入、轴映射与 kLineCenters 判定复用),配合帧内容版本跳过整帧。实测几何准备 P50 由 0.3-6.9ms 降到 0.00ms,geometryBuildCount 600 → 1(18/18 场景),WebGPU ichimoku 10000 由 116.4 升至 185.2/199.7 FPS、jank 由 63.7% 降到 8.0%/0.2%。 - 未来区槽位换算收敛为单一事实来源: 未来区槽位换算抽为
futureBarCount纯函数,三处调用点共享物理像素量纲实现。
工程
- 设置页横向滚动:
BaseTabs溢出时把滚轮映射到scrollLeft并在边缘透传给页面,拖拽改在 document 上运行,解决窄窗口下设置弹窗无法滚动。 - 测试夹具与断言收敛: 抽出
mountChart/makeBars/getModeHandlers/emitResize、scrollContainerStub、共享 HAND 模式挂载与两级 bar 夹具,并把图例、图表 DPR、价格轴、未来区与磁吸用例改为表驱动或复用共享工厂,移除重复断言与全部as unknown as强转。 - 拆分过胖的渲染器测试: 拆分超长渲染器测试文件并共享 Layer store 替身。
- 依赖升级: 将
vite升级至 8.3.1、vitest升级至 5.0.2。 - 格式化与导入排序: 应用 Biome 导入排序与格式化,并修正 agent-runtime 的 tsconfig path 映射写法与工具栏阴影硬编码色。
文档
- 设计决策文档新增: 新增主题预设、资产类别 unknown 过滤、数据层模块布局、绘图复制、绘图会话图层、帧内容版本、帧倒计时时间、未来区默认屏数、未来区两数据槽位、最后价格时段倒计时、未来槽位相对标签、价格轴菜单、价格轴滚轮缩放、退役 RendererPlugin 契约、Scene 窗格区域绑定与图表视图切换等设计决策文档。
- 渲染管线文档补充第三方 Layer 接入:
docs/rendering/rendering-pipeline.md增补第三方 Layer 与指标注册章节,覆盖运行时契约与接入示例。 - PR 流程要求人工测试: 将贡献流程中「中间不经过 E2E 测试、视觉回归测试」改为「中间不经过用户手动测试」。
- 数据源与架构文档同步: 更新架构文档与 BaoStock/MT5 数据源说明以匹配 Provider 语义分层。